Commit | Line | Data |
---|---|---|
36e363c2 NC |
1 | #define PERL_NO_GET_CONTEXT |
2 | ||
96c33d98 YO |
3 | #include "EXTERN.h" |
4 | #include "perl.h" | |
5 | #include "XSUB.h" | |
6 | ||
96c33d98 YO |
7 | MODULE = Hash::Util PACKAGE = Hash::Util |
8 | ||
2caa6900 | 9 | void |
96c33d98 | 10 | all_keys(hash,keys,placeholder) |
2caa6900 NC |
11 | HV *hash |
12 | AV *keys | |
13 | AV *placeholder | |
96c33d98 YO |
14 | PROTOTYPE: \%\@\@ |
15 | PREINIT: | |
96c33d98 YO |
16 | SV *key; |
17 | HE *he; | |
2caa6900 NC |
18 | PPCODE: |
19 | av_clear(keys); | |
20 | av_clear(placeholder); | |
96c33d98 | 21 | |
2caa6900 NC |
22 | (void)hv_iterinit(hash); |
23 | while((he = hv_iternext_flags(hash, HV_ITERNEXT_WANTPLACEHOLDERS))!= NULL) { | |
96c33d98 | 24 | key=hv_iterkeysv(he); |
76cc365d NC |
25 | av_push(HeVAL(he) == &PL_sv_placeholder ? placeholder : keys, |
26 | SvREFCNT_inc(key)); | |
96c33d98 | 27 | } |
2caa6900 | 28 | XSRETURN(1); |
96c33d98 YO |
29 | |
30 | void | |
31 | hidden_ref_keys(hash) | |
2caa6900 | 32 | HV *hash |
76cc365d NC |
33 | ALIAS: |
34 | Hash::Util::legal_ref_keys = 1 | |
96c33d98 | 35 | PREINIT: |
96c33d98 YO |
36 | SV *key; |
37 | HE *he; | |
38 | PPCODE: | |
2caa6900 NC |
39 | (void)hv_iterinit(hash); |
40 | while((he = hv_iternext_flags(hash, HV_ITERNEXT_WANTPLACEHOLDERS))!= NULL) { | |
96c33d98 | 41 | key=hv_iterkeysv(he); |
76cc365d | 42 | if (ix || HeVAL(he) == &PL_sv_placeholder) { |
96c33d98 YO |
43 | XPUSHs( key ); |
44 | } | |
45 | } | |
46 | ||
47 | void | |
2caa6900 NC |
48 | hv_store(hash, key, val) |
49 | HV *hash | |
96c33d98 YO |
50 | SV* key |
51 | SV* val | |
52 | PROTOTYPE: \%$$ | |
96c33d98 YO |
53 | CODE: |
54 | { | |
96c33d98 | 55 | SvREFCNT_inc(val); |
2caa6900 | 56 | if (!hv_store_ent(hash, key, val, 0)) { |
96c33d98 YO |
57 | SvREFCNT_dec(val); |
58 | XSRETURN_NO; | |
59 | } else { | |
60 | XSRETURN_YES; | |
61 | } | |
96c33d98 | 62 | } |