X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=hv.h;h=e7d0c762ffd6702d8bdbc292bd0257bd0ded0f81;hb=e27835eefa408ae52d4ae22eec67eea282a87949;hp=b1f2ce2006cdcc05d0352320666650bddb3481b9;hpb=20f4945e16943f141ab760ffdcdbf39a5f3b734e;p=p5sagit%2Fp5-mst-13.2.git diff --git a/hv.h b/hv.h index b1f2ce2..e7d0c76 100644 --- a/hv.h +++ b/hv.h @@ -1,7 +1,7 @@ /* 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. @@ -68,7 +68,7 @@ struct xpvhv_aux { #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; \ @@ -165,6 +165,8 @@ is to be expected. (For information only--not to be used). =for apidoc AmU||Nullhv Null HV pointer. +(deprecated - use C<(HV *)NULL> instead) + =head1 Hash Manipulation Functions =for apidoc Am|char*|HvNAME|HV* stash @@ -198,7 +200,18 @@ variable C, though this is rather less efficient than using a local variable. Remember though, that hash keys in perl are free to contain embedded nulls, so using C or similar is not a good way to find the length of hash keys. This is very similar to the C macro -described elsewhere in this document. +described elsewhere in this document. See also C. + +If you are using C to get values to pass to C to create a +new SV, you should consider using C as it is more +efficient. + +=for apidoc Am|char*|HeUTF8|HE* he|STRLEN len +Returns whether the C value returned by C is encoded in UTF-8, +doing any necessary dereferencing of possibly C keys. The value returned +will be 0 or non-0, not necessarily 1 (or even a value with any low bits set), +so B blindly assign this to a C variable, as C may be a +typedef for C. =for apidoc Am|SV*|HeSVKEY|HE* he Returns the key as an C, or C if the hash entry does not @@ -219,8 +232,9 @@ C. /* 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 @@ -289,7 +303,9 @@ C. #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)) @@ -305,6 +321,9 @@ C. #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) ? \ @@ -313,12 +332,14 @@ C. #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 @@ -385,42 +406,42 @@ C. ->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.