/* hv.h
*
- * Copyright (c) 1991-2001, Larry Wall
+ * Copyright (c) 1991-2002, 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.
U32 hek_hash; /* hash of key */
I32 hek_len; /* length of hash key */
char hek_key[1]; /* variable-length hash key */
+ /* the hash-key is \0-terminated */
+ /* after the \0 there is a byte telling whether the key is UTF8 */
};
/* hash structure: */
} STMT_END
/*
+=head1 Hash Manipulation Functions
+
=for apidoc AmU||HEf_SVKEY
This flag, used in the length slot of hash entries and magic structures,
specifies the structure contains an C<SV*> pointer where a C<char*> pointer
is to be expected. (For information only--not to be used).
+=head1 Handy Values
+
=for apidoc AmU||Nullhv
Null HV pointer.
+=head1 Hash Manipulation Functions
+
=for apidoc Am|char*|HvNAME|HV* stash
Returns the package name of a stash. See C<SvSTASH>, C<CvSTASH>.
#define XHvTOTALKEYS(xhv) ((xhv)->xhv_keys)
/* The number of placeholders in the enumerated-keys hash */
-#define XHvPLACEHOLDERS(xhv) ((IV)((xhv)->xhv_placeholders))
+#define XHvPLACEHOLDERS(xhv) ((xhv)->xhv_placeholders)
-/* the number of keys that exist() (i.e. excluding placeholers) */
-#define XHvUSEDKEYS(xhv) (XHvTOTALKEYS(xhv) - XHvPLACEHOLDERS(xhv))
+/* the number of keys that exist() (i.e. excluding placeholders) */
+#define XHvUSEDKEYS(xhv) (XHvTOTALKEYS(xhv) - (IV)XHvPLACEHOLDERS(xhv))
/*
* HvKEYS gets the number of keys that actually exist(), and is provided
#define HvTOTALKEYS(hv) XHvTOTALKEYS((XPVHV*) SvANY(hv))
#define HvPLACEHOLDERS(hv) XHvPLACEHOLDERS((XPVHV*) SvANY(hv))
-
#define HvSHAREKEYS(hv) (SvFLAGS(hv) & SVphv_SHAREKEYS)
#define HvSHAREKEYS_on(hv) (SvFLAGS(hv) |= SVphv_SHAREKEYS)
#define HvSHAREKEYS_off(hv) (SvFLAGS(hv) &= ~SVphv_SHAREKEYS)
+#define HvUTF8KEYS(hv) (SvFLAGS(hv) & SVphv_UTF8KEYS)
+#define HvUTF8KEYS_on(hv) (SvFLAGS(hv) |= SVphv_UTF8KEYS)
+#define HvUTF8KEYS_off(hv) (SvFLAGS(hv) &= ~SVphv_UTF8KEYS)
+
#define HvLAZYDEL(hv) (SvFLAGS(hv) & SVphv_LAZYDEL)
#define HvLAZYDEL_on(hv) (SvFLAGS(hv) |= SVphv_LAZYDEL)
#define HvLAZYDEL_off(hv) (SvFLAGS(hv) &= ~SVphv_LAZYDEL)
#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)))
+#define HEK_UTF8(hek) (*(HEK_KEY(hek)+HEK_LEN(hek)+1))
/* calculate HV array allocation */
#if defined(STRANGE_MALLOC) || defined(MYMALLOC)