This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
tweaks for win32/borland
[perl5.git] / hv.h
diff --git a/hv.h b/hv.h
index 746e428..3977b1c 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -1,6 +1,6 @@
 /*    hv.h
  *
- *    Copyright (c) 1991-1994, Larry Wall
+ *    Copyright (c) 1991-1999, 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.
@@ -8,26 +8,27 @@
  */
 
 typedef struct he HE;
-typedef struct he_key HEK;
+typedef struct hek HEK;
 
 struct he {
     HE         *hent_next;
-    HEK                *hent_hk;
+    HEK                *hent_hek;
     SV         *hent_val;
 };
 
-struct he_key {
-    U32                hk_hash;
-    I32                hk_len;
-    char       hk_key[1];
+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 */
-    double     xnv_nv;         /* numeric value, if any */
+    IV         xhv_keys;       /* how many elements in the array */
+    NV         xnv_nv;         /* numeric value, if any */
     MAGIC*     xmg_magic;      /* magic for scalar array */
     HV*                xmg_stash;      /* class package */
 
@@ -39,12 +40,12 @@ struct xpvhv {
 
 #define PERL_HASH(hash,str,len) \
      STMT_START        { \
-       register char *s_PeRlHaSh = str; \
+       register const char *s_PeRlHaSh = str; \
        register I32 i_PeRlHaSh = len; \
        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
 
 
@@ -70,8 +71,6 @@ struct xpvhv {
 #define HvLAZYDEL_on(hv)       (SvFLAGS(hv) |= SVphv_LAZYDEL)
 #define HvLAZYDEL_off(hv)      (SvFLAGS(hv) &= ~SVphv_LAZYDEL)
 
-#ifdef OVERLOAD
-
 /* Maybe amagical: */
 /* #define HV_AMAGICmb(hv)      (SvFLAGS(hv) & (SVpgv_badAM | SVpgv_AM)) */
 
@@ -85,19 +84,19 @@ struct xpvhv {
 #define HV_badAMAGIC_off(hv) (SvFLAGS(hv) &= ~SVpgv_badAM)
 */
 
-#endif /* OVERLOAD */
-
 #define Nullhe Null(HE*)
 #define HeNEXT(he)             (he)->hent_next
-#define HeKEY_hk(he)           (he)->hent_hk
-#define HeKEY(he)              HK_KEY(HeKEY_hk(he))
+#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)             HK_LEN(HeKEY_hk(he))
+#define HeKLEN(he)             HEK_LEN(HeKEY_hek(he))
 #define HeVAL(he)              (he)->hent_val
-#define HeHASH(he)             HK_HASH(HeKEY_hk(he))
-#define HePV(he)               ((HeKLEN(he) == HEf_SVKEY) ?            \
-                                SvPV(HeKEY_sv(he),na) :                \
-                                HeKEY(he))
+#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)
@@ -105,11 +104,13 @@ struct xpvhv {
 #define HeSVKEY_force(he)      (HeKEY(he) ?                            \
                                 ((HeKLEN(he) == HEf_SVKEY) ?           \
                                  HeKEY_sv(he) :                        \
-                                 sv_2mortal(newSVpv(HeKEY(he),         \
+                                 sv_2mortal(newSVpvn(HeKEY(he),        \
                                                     HeKLEN(he)))) :    \
-                                &sv_undef)
-#define HeSVKEY_set(he,sv)     (HeKEY_sv(he) = sv)
-
-#define HK_LEN(hk)             (hk)->hk_len
-#define HK_KEY(hk)             (hk)->hk_key
-#define HK_HASH(hk)            (hk)->hk_hash
+                                &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