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