more warning-silencing in FieldHash
[p5sagit/p5-mst-13.2.git] / ext / Hash / Util / Util.xs
CommitLineData
96c33d98 1#include "EXTERN.h"
2#include "perl.h"
3#include "XSUB.h"
4
5
6MODULE = Hash::Util PACKAGE = Hash::Util
7
8
9SV*
10all_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
50void
51hidden_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
71void
72legal_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
90SV*
91hv_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