X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=hv.h;h=20af4eab57815323484beabfbcef5a114c22fd4b;hb=0a5d5e8be390bda2f9b7684490082d428228d28f;hp=746e4286c1c6352229df9c3c44c1e38ffa9b0582;hpb=bbce6d69784bf43b0e69e8d312042d65f258af23;p=p5sagit%2Fp5-mst-13.2.git diff --git a/hv.h b/hv.h index 746e428..20af4ea 100644 --- a/hv.h +++ b/hv.h @@ -1,6 +1,6 @@ /* hv.h * - * Copyright (c) 1991-1994, Larry Wall + * Copyright (c) 1991-1997, 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. @@ -8,18 +8,18 @@ */ typedef struct he HE; -typedef struct he_key HEK; +typedef struct hek HEK; struct he { HE *hent_next; - HEK *hent_hk; + HEK *hent_hek; SV *hent_val; }; -struct he_key { - U32 hk_hash; - I32 hk_len; - char hk_key[1]; +struct hek { + U32 hek_hash; + I32 hek_len; + char hek_key[1]; }; struct xpvhv { @@ -89,15 +89,17 @@ struct xpvhv { #define Nullhe Null(HE*) #define HeNEXT(he) (he)->hent_next -#define HeKEY_hk(he) (he)->hent_hk -#define HeKEY(he) HK_KEY(HeKEY_hk(he)) +#define HeKEY_hek(he) (he)->hent_hek +#define HeKEY(he) HEK_KEY(HeKEY_hek(he)) #define HeKEY_sv(he) (*(SV**)HeKEY(he)) -#define HeKLEN(he) HK_LEN(HeKEY_hk(he)) +#define HeKLEN(he) HEK_LEN(HeKEY_hek(he)) #define HeVAL(he) (he)->hent_val -#define HeHASH(he) HK_HASH(HeKEY_hk(he)) -#define HePV(he) ((HeKLEN(he) == HEf_SVKEY) ? \ - SvPV(HeKEY_sv(he),na) : \ - HeKEY(he)) +#define HeHASH(he) HEK_HASH(HeKEY_hek(he)) +#define HePV(he,lp) ((HeKLEN(he) == HEf_SVKEY) ? \ + SvPV(HeKEY_sv(he),lp) : \ + (((lp = HeKLEN(he)) >= 0) ? \ + HeKEY(he) : Nullch)) + #define HeSVKEY(he) ((HeKEY(he) && \ HeKLEN(he) == HEf_SVKEY) ? \ HeKEY_sv(he) : Nullsv) @@ -108,8 +110,10 @@ struct xpvhv { sv_2mortal(newSVpv(HeKEY(he), \ HeKLEN(he)))) : \ &sv_undef) -#define HeSVKEY_set(he,sv) (HeKEY_sv(he) = sv) +#define HeSVKEY_set(he,sv) ((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv)) -#define HK_LEN(hk) (hk)->hk_len -#define HK_KEY(hk) (hk)->hk_key -#define HK_HASH(hk) (hk)->hk_hash +#define Nullhek Null(HEK*) +#define HEK_BASESIZE STRUCT_OFFSET(HEK, hek_key[0]) +#define HEK_HASH(hek) (hek)->hek_hash +#define HEK_LEN(hek) (hek)->hek_len +#define HEK_KEY(hek) (hek)->hek_key