This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[ID 19990908.014] s2p does not quote @
[perl5.git] / hv.h
... / ...
CommitLineData
1/* hv.h
2 *
3 * Copyright (c) 1991-1999, 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
10typedef struct he HE;
11typedef struct hek HEK;
12
13struct he {
14 HE *hent_next;
15 HEK *hent_hek;
16 SV *hent_val;
17};
18
19struct 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. */
26struct 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 NV 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 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); \
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(newSVpvn(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