📄 util.xs
字号:
#include "EXTERN.h"#include "perl.h"#include "XSUB.h"MODULE = Hash::Util PACKAGE = Hash::UtilSV*all_keys(hash,keys,placeholder) SV* hash SV* keys SV* placeholder PROTOTYPE: \%\@\@ PREINIT: AV* av_k; AV* av_p; HV* hv; SV *key; HE *he; CODE: if (!SvROK(hash) || SvTYPE(SvRV(hash)) != SVt_PVHV) croak("First argument to all_keys() must be an HASH reference"); if (!SvROK(keys) || SvTYPE(SvRV(keys)) != SVt_PVAV) croak("Second argument to all_keys() must be an ARRAY reference"); if (!SvROK(placeholder) || SvTYPE(SvRV(placeholder)) != SVt_PVAV) croak("Third argument to all_keys() must be an ARRAY reference"); hv = (HV*)SvRV(hash); av_k = (AV*)SvRV(keys); av_p = (AV*)SvRV(placeholder); av_clear(av_k); av_clear(av_p); (void)hv_iterinit(hv); while((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))!= NULL) { key=hv_iterkeysv(he); if (HeVAL(he) == &PL_sv_placeholder) { SvREFCNT_inc(key); av_push(av_p, key); } else { SvREFCNT_inc(key); av_push(av_k, key); } } RETVAL=hash;voidhidden_ref_keys(hash) SV* hash PREINIT: HV* hv; SV *key; HE *he; PPCODE: if (!SvROK(hash) || SvTYPE(SvRV(hash)) != SVt_PVHV) croak("First argument to hidden_keys() must be an HASH reference"); hv = (HV*)SvRV(hash); (void)hv_iterinit(hv); while((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))!= NULL) { key=hv_iterkeysv(he); if (HeVAL(he) == &PL_sv_placeholder) { XPUSHs( key ); } }voidlegal_ref_keys(hash) SV* hash PREINIT: HV* hv; SV *key; HE *he; PPCODE: if (!SvROK(hash) || SvTYPE(SvRV(hash)) != SVt_PVHV) croak("First argument to legal_keys() must be an HASH reference"); hv = (HV*)SvRV(hash); (void)hv_iterinit(hv); while((he = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))!= NULL) { key=hv_iterkeysv(he); XPUSHs( key ); }SV*hv_store(hvref, key, val) SV* hvref SV* key SV* val PROTOTYPE: \%$$ PREINIT: HV* hv; CODE: { if (!SvROK(hvref) || SvTYPE(SvRV(hvref)) != SVt_PVHV) croak("First argument to alias_hv() must be a hash reference"); hv = (HV*)SvRV(hvref); SvREFCNT_inc(val); if (!hv_store_ent(hv, key, val, 0)) { SvREFCNT_dec(val); XSRETURN_NO; } else { XSRETURN_YES; } } OUTPUT: RETVAL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -