xref: /openbsd/gnu/usr.bin/perl/ext/Hash-Util/Util.xs (revision 17df1aa7)
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