This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
1f8d9ce9347955b3deda0603fd799185154f6d3b
[perl5.git] / hv.h
1 /*    hv.h
2  *
3  *    Copyright (c) 1991-1997, Larry Wall
4  *
5  *    You may distribute under the terms of either the GNU General Public
6  *    License or the Artistic License, as specified in the README file.
7  *
8  */
9
10 typedef struct he HE;
11 typedef struct hek HEK;
12
13 struct he {
14     HE          *hent_next;
15     HEK         *hent_hek;
16     SV          *hent_val;
17 };
18
19 struct hek {
20     U32         hek_hash;
21     I32         hek_len;
22     char        hek_key[1];
23 };
24
25 /* This structure must match the beginning of struct xpvmg in sv.h. */
26 struct xpvhv {
27     char *      xhv_array;      /* pointer to malloced string */
28     STRLEN      xhv_fill;       /* how full xhv_array currently is */
29     STRLEN      xhv_max;        /* subscript of last element of xhv_array */
30     IV          xhv_keys;       /* how many elements in the array */
31     double      xnv_nv;         /* numeric value, if any */
32     MAGIC*      xmg_magic;      /* magic for scalar array */
33     HV*         xmg_stash;      /* class package */
34
35     I32         xhv_riter;      /* current root of iterator */
36     HE          *xhv_eiter;     /* current entry of iterator */
37     PMOP        *xhv_pmroot;    /* list of pm's for this package */
38     char        *xhv_name;      /* name, if a symbol table */
39 };
40
41 #define PERL_HASH(hash,str,len) \
42      STMT_START { \
43         register char *s_PeRlHaSh = str; \
44         register I32 i_PeRlHaSh = len; \
45         register U32 hash_PeRlHaSh = 0; \
46         while (i_PeRlHaSh--) \
47             hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
48         (hash) = hash_PeRlHaSh + (hash_PeRlHaSh>>5); \
49     } STMT_END
50
51
52 /* these hash entry flags ride on hent_klen (for use only in magic/tied HVs) */
53 #define HEf_SVKEY       -2      /* hent_key is a SV* */
54
55
56 #define Nullhv Null(HV*)
57 #define HvARRAY(hv)     ((HE**)((XPVHV*)  SvANY(hv))->xhv_array)
58 #define HvFILL(hv)      ((XPVHV*)  SvANY(hv))->xhv_fill
59 #define HvMAX(hv)       ((XPVHV*)  SvANY(hv))->xhv_max
60 #define HvKEYS(hv)      ((XPVHV*)  SvANY(hv))->xhv_keys
61 #define HvRITER(hv)     ((XPVHV*)  SvANY(hv))->xhv_riter
62 #define HvEITER(hv)     ((XPVHV*)  SvANY(hv))->xhv_eiter
63 #define HvPMROOT(hv)    ((XPVHV*)  SvANY(hv))->xhv_pmroot
64 #define HvNAME(hv)      ((XPVHV*)  SvANY(hv))->xhv_name
65
66 #define HvSHAREKEYS(hv)         (SvFLAGS(hv) & SVphv_SHAREKEYS)
67 #define HvSHAREKEYS_on(hv)      (SvFLAGS(hv) |= SVphv_SHAREKEYS)
68 #define HvSHAREKEYS_off(hv)     (SvFLAGS(hv) &= ~SVphv_SHAREKEYS)
69
70 #define HvLAZYDEL(hv)           (SvFLAGS(hv) & SVphv_LAZYDEL)
71 #define HvLAZYDEL_on(hv)        (SvFLAGS(hv) |= SVphv_LAZYDEL)
72 #define HvLAZYDEL_off(hv)       (SvFLAGS(hv) &= ~SVphv_LAZYDEL)
73
74 /* Maybe amagical: */
75 /* #define HV_AMAGICmb(hv)      (SvFLAGS(hv) & (SVpgv_badAM | SVpgv_AM)) */
76
77 #define HV_AMAGIC(hv)        (SvFLAGS(hv) &   SVpgv_AM)
78 #define HV_AMAGIC_on(hv)     (SvFLAGS(hv) |=  SVpgv_AM)
79 #define HV_AMAGIC_off(hv)    (SvFLAGS(hv) &= ~SVpgv_AM)
80
81 /*
82 #define HV_AMAGICbad(hv)     (SvFLAGS(hv) & SVpgv_badAM)
83 #define HV_badAMAGIC_on(hv)  (SvFLAGS(hv) |= SVpgv_badAM)
84 #define HV_badAMAGIC_off(hv) (SvFLAGS(hv) &= ~SVpgv_badAM)
85 */
86
87 #define Nullhe Null(HE*)
88 #define HeNEXT(he)              (he)->hent_next
89 #define HeKEY_hek(he)           (he)->hent_hek
90 #define HeKEY(he)               HEK_KEY(HeKEY_hek(he))
91 #define HeKEY_sv(he)            (*(SV**)HeKEY(he))
92 #define HeKLEN(he)              HEK_LEN(HeKEY_hek(he))
93 #define HeVAL(he)               (he)->hent_val
94 #define HeHASH(he)              HEK_HASH(HeKEY_hek(he))
95 #define HePV(he,lp)             ((HeKLEN(he) == HEf_SVKEY) ?            \
96                                  SvPV(HeKEY_sv(he),lp) :                \
97                                  (((lp = HeKLEN(he)) >= 0) ?            \
98                                   HeKEY(he) : Nullch))
99
100 #define HeSVKEY(he)             ((HeKEY(he) &&                          \
101                                   HeKLEN(he) == HEf_SVKEY) ?            \
102                                  HeKEY_sv(he) : Nullsv)
103
104 #define HeSVKEY_force(he)       (HeKEY(he) ?                            \
105                                  ((HeKLEN(he) == HEf_SVKEY) ?           \
106                                   HeKEY_sv(he) :                        \
107                                   sv_2mortal(newSVpv(HeKEY(he),         \
108                                                      HeKLEN(he)))) :    \
109                                  &PL_sv_undef)
110 #define HeSVKEY_set(he,sv)      ((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv))
111
112 #define Nullhek Null(HEK*)
113 #define HEK_BASESIZE            STRUCT_OFFSET(HEK, hek_key[0])
114 #define HEK_HASH(hek)           (hek)->hek_hash
115 #define HEK_LEN(hek)            (hek)->hek_len
116 #define HEK_KEY(hek)            (hek)->hek_key