This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Standardise Hash::Util::hv_store's error message.
[perl5.git] / ext / Hash-Util / Util.xs
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