/* hv.h
*
* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999,
- * 2000, 2001, 2002, 2003, 2005, 2006, 2007, by Larry Wall and others
+ * 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008, by Larry Wall and others
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
#define _XPVHV_ALLOCATED_HEAD \
STRLEN xhv_fill; /* how full xhv_array currently is */ \
- STRLEN xhv_max; /* subscript of last element of xhv_array */
+ STRLEN xhv_max /* subscript of last element of xhv_array */
#define _XPVHV_HEAD \
union _xnvu xnv_u; \
=for apidoc AmU||Nullhv
Null HV pointer.
+(deprecated - use C<(HV *)NULL> instead)
+
=head1 Hash Manipulation Functions
=for apidoc Am|char*|HvNAME|HV* stash
variable. Remember though, that hash keys in perl are free to contain
embedded nulls, so using C<strlen()> or similar is not a good way to find
the length of hash keys. This is very similar to the C<SvPV()> macro
-described elsewhere in this document.
+described elsewhere in this document. See also C<HeUTF8>.
+
+If you are using C<HePV> to get values to pass to C<newSVpvn()> to create a
+new SV, you should consider using C<newSVhek(HeKEY_hek(he))> as it is more
+efficient.
+
+=for apidoc Am|char*|HeUTF8|HE* he|STRLEN len
+Returns whether the C<char *> value returned by C<HePV> is encoded in UTF-8,
+doing any necessary dereferencing of possibly C<SV*> keys. The value returned
+will be 0 or non-0, not necessarily 1 (or even a value with any low bits set),
+so B<do not> blindly assign this to a C<bool> variable, as C<bool> may be a
+typedef for C<char>.
=for apidoc Am|SV*|HeSVKEY|HE* he
Returns the key as an C<SV*>, or C<NULL> if the hash entry does not
/* these hash entry flags ride on hent_klen (for use only in magic/tied HVs) */
#define HEf_SVKEY -2 /* hent_key is an SV* */
-
-#define Nullhv Null(HV*)
+#ifndef PERL_CORE
+# define Nullhv Null(HV*)
+#endif
#define HvARRAY(hv) ((hv)->sv_u.svu_hash)
#define HvFILL(hv) ((XPVHV*) SvANY(hv))->xhv_fill
#define HvMAX(hv) ((XPVHV*) SvANY(hv))->xhv_max
#define HvREHASH_on(hv) (SvFLAGS(hv) |= SVphv_REHASH)
#define HvREHASH_off(hv) (SvFLAGS(hv) &= ~SVphv_REHASH)
-#define Nullhe Null(HE*)
+#ifndef PERL_CORE
+# define Nullhe Null(HE*)
+#endif
#define HeNEXT(he) (he)->hent_next
#define HeKEY_hek(he) (he)->hent_hek
#define HeKEY(he) HEK_KEY(HeKEY_hek(he))
#define HePV(he,lp) ((HeKLEN(he) == HEf_SVKEY) ? \
SvPV(HeKEY_sv(he),lp) : \
((lp = HeKLEN(he)), HeKEY(he)))
+#define HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \
+ SvUTF8(HeKEY_sv(he)) : \
+ (U32)HeKUTF8(he))
#define HeSVKEY(he) ((HeKEY(he) && \
HeKLEN(he) == HEf_SVKEY) ? \
#define HeSVKEY_force(he) (HeKEY(he) ? \
((HeKLEN(he) == HEf_SVKEY) ? \
HeKEY_sv(he) : \
- sv_2mortal(newSVpvn(HeKEY(he), \
- HeKLEN(he)))) : \
+ newSVpvn_flags(HeKEY(he), \
+ HeKLEN(he), SVs_TEMP)) : \
&PL_sv_undef)
#define HeSVKEY_set(he,sv) ((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv))
-#define Nullhek Null(HEK*)
+#ifndef PERL_CORE
+# define Nullhek Null(HEK*)
+#endif
#define HEK_BASESIZE STRUCT_OFFSET(HEK, hek_key[0])
#define HEK_HASH(hek) (hek)->hek_hash
#define HEK_LEN(hek) (hek)->hek_len
->shared_he_he.he_valu.hent_refcount), \
hek)
-#define hv_store_ent(zlonk, awk, touche, zgruppp) \
- ((HE *) hv_common((zlonk), (awk), NULL, 0, 0, HV_FETCH_ISSTORE, \
- (touche), (zgruppp)))
+#define hv_store_ent(hv, keysv, val, hash) \
+ ((HE *) hv_common((hv), (keysv), NULL, 0, 0, HV_FETCH_ISSTORE, \
+ (val), (hash)))
-#define hv_exists_ent(zlonk, awk, zgruppp) \
- (hv_common((zlonk), (awk), NULL, 0, 0, HV_FETCH_ISEXISTS, 0, (zgruppp))\
+#define hv_exists_ent(hv, keysv, hash) \
+ (hv_common((hv), (keysv), NULL, 0, 0, HV_FETCH_ISEXISTS, 0, (hash)) \
? TRUE : FALSE)
-#define hv_fetch_ent(zlonk, awk, touche, zgruppp) \
- ((HE *) hv_common((zlonk), (awk), NULL, 0, 0, \
- ((touche) ? HV_FETCH_LVALUE : 0), NULL, (zgruppp)))
-#define hv_delete_ent(zlonk, awk, touche, zgruppp) \
- ((SV *) hv_common((zlonk), (awk), NULL, 0, 0, (touche) | HV_DELETE, \
- NULL, (zgruppp)))
-
-#define hv_store_flags(urkk, zamm, clunk, thwape, sploosh, eee_yow) \
- ((SV**) hv_common((urkk), NULL, (zamm), (clunk), (eee_yow), \
- (HV_FETCH_ISSTORE|HV_FETCH_JUST_SV), (thwape), \
- (sploosh)))
-
-#define hv_store(urkk, zamm, clunk, thwape, sploosh) \
- ((SV**) hv_common_key_len((urkk), (zamm), (clunk), \
+#define hv_fetch_ent(hv, keysv, lval, hash) \
+ ((HE *) hv_common((hv), (keysv), NULL, 0, 0, \
+ ((lval) ? HV_FETCH_LVALUE : 0), NULL, (hash)))
+#define hv_delete_ent(hv, key, flags, hash) \
+ ((SV *) hv_common((hv), (key), NULL, 0, 0, (flags) | HV_DELETE, \
+ NULL, (hash)))
+
+#define hv_store_flags(hv, key, klen, val, hash, flags) \
+ ((SV**) hv_common((hv), NULL, (key), (klen), (flags), \
+ (HV_FETCH_ISSTORE|HV_FETCH_JUST_SV), (val), \
+ (hash)))
+
+#define hv_store(hv, key, klen, val, hash) \
+ ((SV**) hv_common_key_len((hv), (key), (klen), \
(HV_FETCH_ISSTORE|HV_FETCH_JUST_SV), \
- (thwape), (sploosh)))
+ (val), (hash)))
-#define hv_exists(urkk, zamm, clunk) \
- (hv_common_key_len((urkk), (zamm), (clunk), HV_FETCH_ISEXISTS, NULL, 0) \
+#define hv_exists(hv, key, klen) \
+ (hv_common_key_len((hv), (key), (klen), HV_FETCH_ISEXISTS, NULL, 0) \
? TRUE : FALSE)
-#define hv_fetch(urkk, zamm, clunk, pam) \
- ((SV**) hv_common_key_len((urkk), (zamm), (clunk), (pam) \
+#define hv_fetch(hv, key, klen, lval) \
+ ((SV**) hv_common_key_len((hv), (key), (klen), (lval) \
? (HV_FETCH_JUST_SV | HV_FETCH_LVALUE) \
: HV_FETCH_JUST_SV, NULL, 0))
-#define hv_delete(urkk, zamm, clunk, pam) \
- ((SV*) hv_common_key_len((urkk), (zamm), (clunk), \
- (pam) | HV_DELETE, NULL, 0))
+#define hv_delete(hv, key, klen, flags) \
+ ((SV*) hv_common_key_len((hv), (key), (klen), \
+ (flags) | HV_DELETE, NULL, 0))
/* This refcounted he structure is used for storing the hints used for lexical
pragmas. Without threads, it's basically struct he + refcount.