This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
unsubmitted _74 tweaks
[perl5.git] / hv.h
CommitLineData
a0d0e21e 1/* hv.h
79072805 2 *
9607fc9c 3 * Copyright (c) 1991-1997, Larry Wall
79072805
LW
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
LW
8 */
9
79072805 10typedef struct he HE;
ff68c719 11typedef struct hek HEK;
79072805
LW
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
LW
23};
24
c4f23d77 25/* This structure must match the beginning of struct xpvmg in sv.h. */
79072805 26struct xpvhv {
463ee0b2
LW
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 */
c4f23d77 30 IV xhv_keys; /* how many elements in the array */
79072805
LW
31 double xnv_nv; /* numeric value, if any */
32 MAGIC* xmg_magic; /* magic for scalar array */
33 HV* xmg_stash; /* class package */
34
79072805
LW
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 */
79072805
LW
39};
40
bf6bd887 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; \
49 } STMT_END
50
51
bf5b86ae
GS
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* */
bf6bd887 54
55
79072805 56#define Nullhv Null(HV*)
463ee0b2 57#define HvARRAY(hv) ((HE**)((XPVHV*) SvANY(hv))->xhv_array)
79072805 58#define HvFILL(hv) ((XPVHV*) SvANY(hv))->xhv_fill
463ee0b2
LW
59#define HvMAX(hv) ((XPVHV*) SvANY(hv))->xhv_max
60#define HvKEYS(hv) ((XPVHV*) SvANY(hv))->xhv_keys
79072805
LW
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
a0d0e21e 65
bf6bd887 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
bf5b86ae
GS
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
a0d0e21e
LW
74#ifdef OVERLOAD
75
76/* Maybe amagical: */
77/* #define HV_AMAGICmb(hv) (SvFLAGS(hv) & (SVpgv_badAM | SVpgv_AM)) */
78
79#define HV_AMAGIC(hv) (SvFLAGS(hv) & SVpgv_AM)
80#define HV_AMAGIC_on(hv) (SvFLAGS(hv) |= SVpgv_AM)
81#define HV_AMAGIC_off(hv) (SvFLAGS(hv) &= ~SVpgv_AM)
82
83/*
84#define HV_AMAGICbad(hv) (SvFLAGS(hv) & SVpgv_badAM)
85#define HV_badAMAGIC_on(hv) (SvFLAGS(hv) |= SVpgv_badAM)
86#define HV_badAMAGIC_off(hv) (SvFLAGS(hv) &= ~SVpgv_badAM)
87*/
88
89#endif /* OVERLOAD */
bf6bd887 90
91#define Nullhe Null(HE*)
92#define HeNEXT(he) (he)->hent_next
ff68c719 93#define HeKEY_hek(he) (he)->hent_hek
94#define HeKEY(he) HEK_KEY(HeKEY_hek(he))
bbce6d69 95#define HeKEY_sv(he) (*(SV**)HeKEY(he))
ff68c719 96#define HeKLEN(he) HEK_LEN(HeKEY_hek(he))
bf6bd887 97#define HeVAL(he) (he)->hent_val
ff68c719 98#define HeHASH(he) HEK_HASH(HeKEY_hek(he))
1e422769 99#define HePV(he,lp) ((HeKLEN(he) == HEf_SVKEY) ? \
100 SvPV(HeKEY_sv(he),lp) : \
101 (((lp = HeKLEN(he)) >= 0) ? \
102 HeKEY(he) : Nullch))
103
bbce6d69 104#define HeSVKEY(he) ((HeKEY(he) && \
105 HeKLEN(he) == HEf_SVKEY) ? \
106 HeKEY_sv(he) : Nullsv)
107
108#define HeSVKEY_force(he) (HeKEY(he) ? \
109 ((HeKLEN(he) == HEf_SVKEY) ? \
110 HeKEY_sv(he) : \
111 sv_2mortal(newSVpv(HeKEY(he), \
112 HeKLEN(he)))) : \
bf6bd887 113 &sv_undef)
1e422769 114#define HeSVKEY_set(he,sv) ((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv))
bbce6d69 115
ff68c719 116#define Nullhek Null(HEK*)
71be2cbc 117#define HEK_BASESIZE STRUCT_OFFSET(HEK, hek_key[0])
ff68c719 118#define HEK_HASH(hek) (hek)->hek_hash
119#define HEK_LEN(hek) (hek)->hek_len
120#define HEK_KEY(hek) (hek)->hek_key