Accessing unicode keys in tie hashes via hv_exists was broken.
[p5sagit/p5-mst-13.2.git] / ext / XS / APItest / APItest.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5
6 MODULE = XS::APItest:Hash               PACKAGE = XS::APItest::Hash
7
8 bool
9 exists(hash, key_sv)
10         PREINIT:
11         STRLEN len;
12         const char *key;
13         INPUT:
14         HV *hash
15         SV *key_sv
16         CODE:
17         key = SvPV(key_sv, len);
18         RETVAL = hv_exists(hash, key, SvUTF8(key_sv) ? -len : len);
19         OUTPUT:
20         RETVAL
21
22 =pod
23
24 sub TIEHASH  { bless {}, $_[0] }
25 sub STORE    { $_[0]->{$_[1]} = $_[2] }
26 sub FETCH    { $_[0]->{$_[1]} }
27 sub FIRSTKEY { my $a = scalar keys %{$_[0]}; each %{$_[0]} }
28 sub NEXTKEY  { each %{$_[0]} }
29 sub EXISTS   { exists $_[0]->{$_[1]} }
30 sub DELETE   { delete $_[0]->{$_[1]} }
31 sub CLEAR    { %{$_[0]} = () }
32
33 =cut
34
35 MODULE = XS::APItest            PACKAGE = XS::APItest
36
37 PROTOTYPES: DISABLE
38
39 void
40 print_double(val)
41         double val
42         CODE:
43         printf("%5.3f\n",val);
44
45 int
46 have_long_double()
47         CODE:
48 #ifdef HAS_LONG_DOUBLE
49         RETVAL = 1;
50 #else
51         RETVAL = 0;
52 #endif
53         OUTPUT:
54         RETVAL
55
56 void
57 print_long_double()
58         CODE:
59 #ifdef HAS_LONG_DOUBLE
60 #   if defined(PERL_PRIfldbl) && (LONG_DOUBLESIZE > DOUBLESIZE)
61         long double val = 7.0;
62         printf("%5.3" PERL_PRIfldbl "\n",val);
63 #   else
64         double val = 7.0;
65         printf("%5.3f\n",val);
66 #   endif
67 #endif
68
69 void
70 print_int(val)
71         int val
72         CODE:
73         printf("%d\n",val);
74
75 void
76 print_long(val)
77         long val
78         CODE:
79         printf("%ld\n",val);
80
81 void
82 print_float(val)
83         float val
84         CODE:
85         printf("%5.3f\n",val);
86         
87 void
88 print_flush()
89         CODE:
90         fflush(stdout);