diff options
author | Malcolm Beattie <mbeattie@sable.ox.ac.uk> | 1997-03-28 13:32:21 +0000 |
---|---|---|
committer | Malcolm Beattie <mbeattie@sable.ox.ac.uk> | 1997-03-28 13:32:21 +0000 |
commit | c750a3ec3b866067ab46dbcc9083205d823047c3 (patch) | |
tree | df8ac921c8928fe673a259a2f22aa1f53156cb92 /av.c | |
parent | cfe4554026dfe078c2d7c706ace0e327f16b2c05 (diff) | |
download | perl-c750a3ec3b866067ab46dbcc9083205d823047c3.tar.gz |
Initial devel changes.
Pseudo-hashes. Optional strong typing. RESTART {}.
p4raw-id: //depot/perl@2
Diffstat (limited to 'av.c')
-rw-r--r-- | av.c | 170 |
1 files changed, 170 insertions, 0 deletions
@@ -463,3 +463,173 @@ I32 fill; else (void)av_store(av,fill,&sv_undef); } + +SV** +avhv_fetch(av, key, klen, lval) +AV *av; +char *key; +U32 klen; +I32 lval; +{ + SV **keys, **indsvp; + I32 ind; + + keys = av_fetch(av, 0, FALSE); + if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV) + croak("Can't coerce array into hash"); + indsvp = hv_fetch((HV*)SvRV(*keys), key, klen, FALSE); + if (indsvp) { + ind = SvIV(*indsvp); + if (ind < 1) + croak("Bad index while coercing array into hash"); + } else { + if (!lval) + return 0; + + ind = AvFILL(av) + 1; + hv_store((HV*)SvRV(*keys), key, klen, newSViv(ind), 0); + } + return av_fetch(av, ind, lval); +} + +SV** +avhv_store(av, key, klen, val, hash) +AV *av; +char *key; +U32 klen; +SV *val; +U32 hash; +{ + SV **keys, **indsvp; + I32 ind; + + keys = av_fetch(av, 0, FALSE); + if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV) + croak("Can't coerce array into hash"); + indsvp = hv_fetch((HV*)SvRV(*keys), key, klen, FALSE); + if (indsvp) { + ind = SvIV(*indsvp); + if (ind < 1) + croak("Bad index while coercing array into hash"); + } else { + ind = AvFILL(av) + 1; + hv_store((HV*)SvRV(*keys), key, klen, newSViv(ind), hash); + } + return av_store(av, ind, val); +} + +bool +avhv_exists(av, key, klen) +AV *av; +char *key; +U32 klen; +{ + SV **keys; + + keys = av_fetch(av, 0, FALSE); + if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV) + croak("Can't coerce array into hash"); + return hv_exists((HV*)SvRV(*keys), key, klen); +} + +/* avhv_delete leaks. Caller can re-index and compress if so desired. */ +SV * +avhv_delete(av, key, klen, flags) +AV *av; +char *key; +U32 klen; +I32 flags; +{ + SV **keys; + SV *sv; + SV **svp; + I32 ind; + + keys = av_fetch(av, 0, FALSE); + if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV) + croak("Can't coerce array into hash"); + sv = hv_delete((HV*)SvRV(*keys), key, klen, 0); + if (!sv) + return Nullsv; + ind = SvIV(sv); + if (ind < 1) + croak("Bad index while coercing array into hash"); + svp = av_fetch(av, ind, FALSE); + if (!svp) + return Nullsv; + if (flags & G_DISCARD) { + sv = Nullsv; + SvREFCNT_dec(*svp); + } else { + sv = sv_2mortal(*svp); + } + *svp = &sv_undef; + return sv; +} + +I32 +avhv_iterinit(av) +AV *av; +{ + SV **keys; + + keys = av_fetch(av, 0, FALSE); + if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV) + croak("Can't coerce array into hash"); + return hv_iterinit((HV*)SvRV(*keys)); +} + +HE * +avhv_iternext(av) +AV *av; +{ + SV **keys; + + keys = av_fetch(av, 0, FALSE); + if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV) + croak("Can't coerce array into hash"); + return hv_iternext((HV*)SvRV(*keys)); +} + +SV * +avhv_iterval(av, entry) +AV *av; +register HE *entry; +{ + SV **keys; + SV *sv; + I32 ind; + + keys = av_fetch(av, 0, FALSE); + if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV) + croak("Can't coerce array into hash"); + sv = hv_iterval((HV*)SvRV(*keys), entry); + ind = SvIV(sv); + if (ind < 1) + croak("Bad index while coercing array into hash"); + return *av_fetch(av, ind, TRUE); +} + +SV * +avhv_iternextsv(av, key, retlen) +AV *av; +char **key; +I32 *retlen; +{ + SV **keys; + HE *he; + SV *sv; + I32 ind; + + keys = av_fetch(av, 0, FALSE); + if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV) + croak("Can't coerce array into hash"); + if ( (he = hv_iternext((HV*)SvRV(*keys))) == NULL) + return NULL; + *key = hv_iterkey(he, retlen); + sv = hv_iterval((HV*)SvRV(*keys), he); + ind = SvIV(sv); + if (ind < 1) + croak("Bad index while coercing array into hash"); + return *av_fetch(av, ind, TRUE); +} |