3 * Copyright (c) 1991-1997, Larry Wall
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.
11 typedef struct hek HEK;
25 /* This structure must match the beginning of struct xpvmg in sv.h. */
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 */
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 */
41 #define PERL_HASH(hash,str,len) \
43 register const 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); \
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* */
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
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)
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)
75 /* #define HV_AMAGICmb(hv) (SvFLAGS(hv) & (SVpgv_badAM | SVpgv_AM)) */
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)
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)
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) ? \
100 #define HeSVKEY(he) ((HeKEY(he) && \
101 HeKLEN(he) == HEf_SVKEY) ? \
102 HeKEY_sv(he) : Nullsv)
104 #define HeSVKEY_force(he) (HeKEY(he) ? \
105 ((HeKLEN(he) == HEf_SVKEY) ? \
107 sv_2mortal(newSVpv(HeKEY(he), \
110 #define HeSVKEY_set(he,sv) ((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv))
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