Commit | Line | Data |
96c33d98 |
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 | SV* |
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 alias_hv() 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 | OUTPUT: |
113 | RETVAL |