1 #include "EXTERN.h" 2 #include "perl.h" 3 #include "XSUB.h" 4 5 6 MODULE = Hash::Util PACKAGE = Hash::Util 7 8 9 SV* 10 all_keys(hash,keys,placeholder) 11 SV* hash 12 SV* keys 13 SV* placeholder 14 PROTOTYPE: \%\@\@ 15 PREINIT: 16 AV* av_k; 17 AV* av_p; 18 HV* hv; 19 SV *key; 20 HE *he; 21 CODE: 22 if (!SvROK(hash) || SvTYPE(SvRV(hash)) != SVt_PVHV) 23 croak("First argument to all_keys() must be an HASH reference"); 24 if (!SvROK(keys) || SvTYPE(SvRV(keys)) != SVt_PVAV) 25 croak("Second argument to all_keys() must be an ARRAY reference"); 26 if (!SvROK(placeholder) || SvTYPE(SvRV(placeholder)) != SVt_PVAV) 27 croak("Third argument to all_keys() must be an ARRAY reference"); 28 29 hv = (HV*)SvRV(hash); 30 av_k = (AV*)SvRV(keys); 31 av_p = (AV*)SvRV(placeholder); 32 33 av_clear(av_k); 34 av_clear(av_p); 35 36 (void)hv_iterinit(hv); 37 while((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))!= NULL) { 38 key=hv_iterkeysv(he); 39 if (HeVAL(he) == &PL_sv_placeholder) { 40 SvREFCNT_inc(key); 41 av_push(av_p, key); 42 } else { 43 SvREFCNT_inc(key); 44 av_push(av_k, key); 45 } 46 } 47 RETVAL=hash; 48 49 50 void 51 hidden_ref_keys(hash) 52 SV* hash 53 PREINIT: 54 HV* hv; 55 SV *key; 56 HE *he; 57 PPCODE: 58 if (!SvROK(hash) || SvTYPE(SvRV(hash)) != SVt_PVHV) 59 croak("First argument to hidden_keys() must be an HASH reference"); 60 61 hv = (HV*)SvRV(hash); 62 63 (void)hv_iterinit(hv); 64 while((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))!= NULL) { 65 key=hv_iterkeysv(he); 66 if (HeVAL(he) == &PL_sv_placeholder) { 67 XPUSHs( key ); 68 } 69 } 70 71 void 72 legal_ref_keys(hash) 73 SV* hash 74 PREINIT: 75 HV* hv; 76 SV *key; 77 HE *he; 78 PPCODE: 79 if (!SvROK(hash) || SvTYPE(SvRV(hash)) != SVt_PVHV) 80 croak("First argument to legal_keys() must be an HASH reference"); 81 82 hv = (HV*)SvRV(hash); 83 84 (void)hv_iterinit(hv); 85 while((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))!= NULL) { 86 key=hv_iterkeysv(he); 87 XPUSHs( key ); 88 } 89 90 void 91 hv_store(hvref, key, val) 92 SV* hvref 93 SV* key 94 SV* val 95 PROTOTYPE: \%$$ 96 PREINIT: 97 HV* hv; 98 CODE: 99 { 100 if (!SvROK(hvref) || SvTYPE(SvRV(hvref)) != SVt_PVHV) 101 croak("First argument to hv_store() must be a hash reference"); 102 hv = (HV*)SvRV(hvref); 103 SvREFCNT_inc(val); 104 if (!hv_store_ent(hv, key, val, 0)) { 105 SvREFCNT_dec(val); 106 XSRETURN_NO; 107 } else { 108 XSRETURN_YES; 109 } 110 } 111 112