/* hv.h
*
- * Copyright (c) 1991-1994, Larry Wall
+ * Copyright (c) 1991-1997, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
*/
typedef struct he HE;
+typedef struct hek HEK;
struct he {
HE *hent_next;
- char *hent_key;
+ HEK *hent_hek;
SV *hent_val;
- U32 hent_hash;
- I32 hent_klen;
};
+struct hek {
+ U32 hek_hash;
+ I32 hek_len;
+ char hek_key[1];
+};
+
+/* This structure must match the beginning of struct xpvmg in sv.h. */
struct xpvhv {
char * xhv_array; /* pointer to malloced string */
STRLEN xhv_fill; /* how full xhv_array currently is */
STRLEN xhv_max; /* subscript of last element of xhv_array */
- I32 xhv_keys; /* how many elements in the array */
+ IV xhv_keys; /* how many elements in the array */
double xnv_nv; /* numeric value, if any */
MAGIC* xmg_magic; /* magic for scalar array */
HV* xmg_stash; /* class package */
register U32 hash_PeRlHaSh = 0; \
while (i_PeRlHaSh--) \
hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
- (hash) = hash_PeRlHaSh; \
+ (hash) = hash_PeRlHaSh + (hash_PeRlHaSh>>5); \
} STMT_END
#define Nullhe Null(HE*)
#define HeNEXT(he) (he)->hent_next
-#define HeKEY(he) (he)->hent_key
-#define HeKLEN(he) (he)->hent_klen
+#define HeKEY_hek(he) (he)->hent_hek
+#define HeKEY(he) HEK_KEY(HeKEY_hek(he))
+#define HeKEY_sv(he) (*(SV**)HeKEY(he))
+#define HeKLEN(he) HEK_LEN(HeKEY_hek(he))
#define HeVAL(he) (he)->hent_val
-#define HeHASH(he) (he)->hent_hash
-#define HePV(he) ((he)->hent_klen == HEf_SVKEY) ? \
- SvPV((SV*)((he)->hent_key),na) : \
- (he)->hent_key))
-#define HeSVKEY(he) (((he)->hent_key && \
- (he)->hent_klen == HEf_SVKEY) ? \
- (SV*)((he)->hent_key) : Nullsv)
-
-#define HeSVKEY_force(he) ((he)->hent_key ? \
- (((he)->hent_klen == HEf_SVKEY) ? \
- (SV*)((he)->hent_key) : \
- sv_2mortal(newSVpv((he)->hent_key, \
- (he)->hent_klen))) : \
- &sv_undef)
+#define HeHASH(he) HEK_HASH(HeKEY_hek(he))
+#define HePV(he,lp) ((HeKLEN(he) == HEf_SVKEY) ? \
+ SvPV(HeKEY_sv(he),lp) : \
+ (((lp = HeKLEN(he)) >= 0) ? \
+ HeKEY(he) : Nullch))
+
+#define HeSVKEY(he) ((HeKEY(he) && \
+ HeKLEN(he) == HEf_SVKEY) ? \
+ HeKEY_sv(he) : Nullsv)
+
+#define HeSVKEY_force(he) (HeKEY(he) ? \
+ ((HeKLEN(he) == HEf_SVKEY) ? \
+ HeKEY_sv(he) : \
+ sv_2mortal(newSVpv(HeKEY(he), \
+ HeKLEN(he)))) : \
+ &PL_sv_undef)
+#define HeSVKEY_set(he,sv) ((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv))
+
+#define Nullhek Null(HEK*)
+#define HEK_BASESIZE STRUCT_OFFSET(HEK, hek_key[0])
+#define HEK_HASH(hek) (hek)->hek_hash
+#define HEK_LEN(hek) (hek)->hek_len
+#define HEK_KEY(hek) (hek)->hek_key