Updated to match Configure.
[p5sagit/p5-mst-13.2.git] / hv.h
diff --git a/hv.h b/hv.h
index cdb4863..a9de8ca 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -1,30 +1,12 @@
-/* $RCSfile: hash.h,v $$Revision: 4.1 $$Date: 92/08/07 18:21:52 $
+/*    hv.h
  *
- *    Copyright (c) 1991, Larry Wall
+ *    Copyright (c) 1991-1994, 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.
  *
- * $Log:       hash.h,v $
- * Revision 4.1  92/08/07  18:21:52  lwall
- * 
- * Revision 4.0.1.2  91/11/05  17:24:31  lwall
- * patch11: random cleanup
- * 
- * Revision 4.0.1.1  91/06/07  11:10:33  lwall
- * patch4: new copyright notice
- * 
- * Revision 4.0  91/03/20  01:22:38  lwall
- * 4.0 baseline.
- * 
  */
 
-#define FILLPCT 80             /* don't make greater than 99 */
-#define DBM_CACHE_MAX 63       /* cache 64 entries for dbm file */
-                               /* (resident array acts as a write-thru cache)*/
-
-#define COEFFSIZE (16 * 8)     /* size of coeff array */
-
 typedef struct he HE;
 
 struct he {
@@ -36,47 +18,84 @@ struct he {
 };
 
 struct xpvhv {
-    char *     xpv_pv;         /* pointer to malloced string */
-    STRLEN     xpv_cur;        /* length of xp_pv as a C string */
-    STRLEN     xpv_len;        /* allocated size */
-    STRLEN     xof_off;        /* ptr is incremented by offset */
+    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 */
     MAGIC*     xmg_magic;      /* magic for scalar array */
     HV*                xmg_stash;      /* class package */
 
-    MAGIC*      xhv_magic;     /* magic for elements */
-
-    HE         **xhv_array;
-    I32                xhv_max;        /* subscript of last element of xhv_array */
-    I32                xhv_dosplit;    /* how full to get before splitting */
-    I32                xhv_fill;       /* how full xhv_array currently is */
     I32                xhv_riter;      /* current root of iterator */
     HE         *xhv_eiter;     /* current entry of iterator */
     PMOP       *xhv_pmroot;    /* list of pm's for this package */
     char       *xhv_name;      /* name, if a symbol table */
-#ifdef SOME_DBM
-#ifdef HAS_GDBM
-    GDBM_FILE  xhv_dbm;
-#else
-#ifdef HAS_NDBM
-    DBM                *xhv_dbm;
-#else
-    I32                xhv_dbm;
-#endif
-#endif
-#endif
-    unsigned char xhv_coeffsize; /* is 0 for symbol tables */
 };
 
+#define PERL_HASH(hash,str,len) \
+     STMT_START        { \
+       register 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; \
+    } STMT_END
+
+
+/* these hash entry flags ride on hent_klen */
+
+#define HEf_LAZYDEL    -1      /* entry must be deleted during next iter step */
+#define HEf_SVKEY      -2      /* hent_key is a SV* (only for magic/tied HVs) */
+
+
 #define Nullhv Null(HV*)
-#define HvMAGIC(hv)    ((XPVHV*)  SvANY(hv))->xhv_magic
-#define HvARRAY(hv)    ((XPVHV*)  SvANY(hv))->xhv_array
-#define HvMAX(hv)      ((XPVHV*)  SvANY(hv))->xhv_max
-#define HvDOSPLIT(hv)  ((XPVHV*)  SvANY(hv))->xhv_dosplit
+#define HvARRAY(hv)    ((HE**)((XPVHV*)  SvANY(hv))->xhv_array)
 #define HvFILL(hv)     ((XPVHV*)  SvANY(hv))->xhv_fill
+#define HvMAX(hv)      ((XPVHV*)  SvANY(hv))->xhv_max
+#define HvKEYS(hv)     ((XPVHV*)  SvANY(hv))->xhv_keys
 #define HvRITER(hv)    ((XPVHV*)  SvANY(hv))->xhv_riter
 #define HvEITER(hv)    ((XPVHV*)  SvANY(hv))->xhv_eiter
 #define HvPMROOT(hv)   ((XPVHV*)  SvANY(hv))->xhv_pmroot
 #define HvNAME(hv)     ((XPVHV*)  SvANY(hv))->xhv_name
-#define HvDBM(hv)      ((XPVHV*)  SvANY(hv))->xhv_dbm
-#define HvCOEFFSIZE(hv)        ((XPVHV*)  SvANY(hv))->xhv_coeffsize
+
+#define HvSHAREKEYS(hv)                (SvFLAGS(hv) & SVphv_SHAREKEYS)
+#define HvSHAREKEYS_on(hv)     (SvFLAGS(hv) |= SVphv_SHAREKEYS)
+#define HvSHAREKEYS_off(hv)    (SvFLAGS(hv) &= ~SVphv_SHAREKEYS)
+
+#ifdef OVERLOAD
+
+/* Maybe amagical: */
+/* #define HV_AMAGICmb(hv)      (SvFLAGS(hv) & (SVpgv_badAM | SVpgv_AM)) */
+
+#define HV_AMAGIC(hv)        (SvFLAGS(hv) &   SVpgv_AM)
+#define HV_AMAGIC_on(hv)     (SvFLAGS(hv) |=  SVpgv_AM)
+#define HV_AMAGIC_off(hv)    (SvFLAGS(hv) &= ~SVpgv_AM)
+
+/*
+#define HV_AMAGICbad(hv)     (SvFLAGS(hv) & SVpgv_badAM)
+#define HV_badAMAGIC_on(hv)  (SvFLAGS(hv) |= SVpgv_badAM)
+#define HV_badAMAGIC_off(hv) (SvFLAGS(hv) &= ~SVpgv_badAM)
+*/
+
+#endif /* OVERLOAD */
+
+#define Nullhe Null(HE*)
+#define HeNEXT(he)             (he)->hent_next
+#define HeKEY(he)              (he)->hent_key
+#define HeKLEN(he)             (he)->hent_klen
+#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)