This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate mainline
[perl5.git] / hv.h
diff --git a/hv.h b/hv.h
index 5bc38a0..f8cf2b9 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -7,21 +7,25 @@
  *
  */
 
+/* typedefs to eliminate some typing */
 typedef struct he HE;
 typedef struct hek HEK;
 
+/* entry in hash value chain */
 struct he {
-    HE         *hent_next;
-    HEK                *hent_hek;
-    SV         *hent_val;
+    HE         *hent_next;     /* next entry in chain */
+    HEK                *hent_hek;      /* hash key */
+    SV         *hent_val;      /* scalar value that was hashed */
 };
 
+/* hash key -- defined separately for use as shared pointer */
 struct hek {
-    U32                hek_hash;
-    I32                hek_len;
-    char       hek_key[1];
+    U32                hek_hash;       /* hash of key */
+    I32                hek_len;        /* length of hash key */
+    char       hek_key[1];     /* variable-length hash key */
 };
 
+/* hash structure: */
 /* This structure must match the beginning of struct xpvmg in sv.h. */
 struct xpvhv {
     char *     xhv_array;      /* pointer to malloced string */
@@ -38,6 +42,7 @@ struct xpvhv {
     char       *xhv_name;      /* name, if a symbol table */
 };
 
+/* hash a key */
 #define PERL_HASH(hash,str,len) \
      STMT_START        { \
        register const char *s_PeRlHaSh = str; \
@@ -146,6 +151,8 @@ C<SV*>.
 #define HeKEY(he)              HEK_KEY(HeKEY_hek(he))
 #define HeKEY_sv(he)           (*(SV**)HeKEY(he))
 #define HeKLEN(he)             HEK_LEN(HeKEY_hek(he))
+#define HeKUTF8(he)  HEK_UTF8(HeKEY_hek(he))
+#define HeKLEN_UTF8(he)  (HeKUTF8(he) ? -HeKLEN(he) : HeKLEN(he))
 #define HeVAL(he)              (he)->hent_val
 #define HeHASH(he)             HEK_HASH(HeKEY_hek(he))
 #define HePV(he,lp)            ((HeKLEN(he) == HEf_SVKEY) ?            \
@@ -170,7 +177,9 @@ C<SV*>.
 #define HEK_HASH(hek)          (hek)->hek_hash
 #define HEK_LEN(hek)           (hek)->hek_len
 #define HEK_KEY(hek)           (hek)->hek_key
+#define HEK_UTF8(hek)  (*(HEK_KEY(hek)+HEK_LEN(hek)))
 
+/* calculate HV array allocation */
 #if defined(STRANGE_MALLOC) || defined(MYMALLOC)
 #  define PERL_HV_ARRAY_ALLOC_BYTES(size) ((size) * sizeof(HE*))
 #else