/* hash key -- defined separately for use as shared pointer */
struct hek {
- U32 hek_hash; /* hash of key */
- I32 hek_len; /* length of hash key */
- char hek_flags; /* The flags associated with this key */
- char hek_key[1]; /* variable-length hash key */
+ U32 hek_hash; /* computed hash of key */
+ I32 hek_len; /* length of the hash key */
+ /* Be careful! Sometimes we store a pointer in the hek_key
+ * buffer, which means it must be 8 byte aligned or things
+ * dont work on aligned platforms like HPUX
+ * Also beware, the last byte of the hek_key buffer is a
+ * hidden flags byte about the key. */
+ char hek_key[1]; /* variable-length hash key */
/* the hash-key is \0-terminated */
+ /* after the \0 there is a byte for flags, such as whether the key
+ is UTF-8 or WAS-UTF-8, or an SV */
};
struct shared_he {
#define HEK_HASH(hek) (hek)->hek_hash
#define HEK_LEN(hek) (hek)->hek_len
#define HEK_KEY(hek) (hek)->hek_key
-#define HEK_FLAGS(hek) (hek)->hek_flags
+#define HEK_FLAGS(hek) (*((unsigned char *)(HEK_KEY(hek))+HEK_LEN(hek)+1))
#define HVhek_UTF8 0x01 /* Key is utf8 encoded. */
#define HVhek_WASUTF8 0x02 /* Key is bytes here, but was supplied as utf8. */