-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_fetch_ent(av, keysv, lval, hash)
-AV *av;
-SV *keysv;
-I32 lval;
-U32 hash;
-{
- SV **keys, **indsvp;
- HE *he;
- I32 ind;
-
- keys = av_fetch(av, 0, FALSE);
- if (!keys || !SvROK(*keys) || SvTYPE(SvRV(*keys)) != SVt_PVHV)
- croak("Can't coerce array into hash");
- he = hv_fetch_ent((HV*)SvRV(*keys), keysv, FALSE, hash);
- if (he) {
- ind = SvIV(HeVAL(he));
- if (ind < 1)
- croak("Bad index while coercing array into hash");
- } else {
- if (!lval)
- return 0;
-
- ind = AvFILL(av) + 1;
- hv_store_ent((HV*)SvRV(*keys), keysv, 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);
-}