This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Replace repetitive code in lib/File/stat.t with a data driven loop.
[perl5.git] / ext / Hash-Util / Util.xs
CommitLineData
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
7MODULE = Hash::Util PACKAGE = Hash::Util
8
2caa6900 9void
96c33d98 10all_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
30void
31hidden_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
47void
2caa6900
NC
48hv_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 }