This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
remove leftovers from [perl #127663]
[perl5.git] / dist / Devel-PPPort / parts / inc / uv
CommitLineData
adfe19db
MHM
1################################################################################
2##
b2049988 3## Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
adfe19db
MHM
4## Version 2.x, Copyright (C) 2001, Paul Marquess.
5## Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
6##
7## This program is free software; you can redistribute it and/or
8## modify it under the same terms as Perl itself.
9##
10################################################################################
11
12=provides
13
adfe19db 14__UNDEFINED__
e28192fd 15my_strnlen
679ad62d 16SvUOK
adfe19db
MHM
17
18=implementation
19
0d0f8426
MHM
20__UNDEFINED__ sv_setuv(sv, uv) \
21 STMT_START { \
22 UV TeMpUv = uv; \
23 if (TeMpUv <= IV_MAX) \
24 sv_setiv(sv, TeMpUv); \
25 else \
26 sv_setnv(sv, (double)TeMpUv); \
27 } STMT_END
28
29__UNDEFINED__ newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
adfe19db
MHM
30
31__UNDEFINED__ sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
32__UNDEFINED__ SvUVX(sv) ((UV)SvIVX(sv))
33__UNDEFINED__ SvUVXx(sv) SvUVX(sv)
34__UNDEFINED__ SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
35__UNDEFINED__ SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
36
37/* Hint: sv_uv
38 * Always use the SvUVx() macro instead of sv_uv().
39 */
40__UNDEFINED__ sv_uv(sv) SvUVx(sv)
41
679ad62d
MHM
42#if !defined(SvUOK) && defined(SvIOK_UV)
43# define SvUOK(sv) SvIOK_UV(sv)
44#endif
45
adfe19db
MHM
46__UNDEFINED__ XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
47__UNDEFINED__ XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END
48
96ad942f
MHM
49__UNDEFINED__ PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
50__UNDEFINED__ XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
51
f2e3e4ce 52#if defined UTF8SKIP
94a2c4f7
KW
53
54/* Don't use official version because it uses MIN, which may not be available */
55#undef UTF8_SAFE_SKIP
56
f2e3e4ce
KW
57__UNDEFINED__ UTF8_SAFE_SKIP(s, e) (__ASSERT_((e) >= (s)) \
58 ((e) - (s)) <= 0 \
59 ? 0 \
60 : (((e) - (s)) >= UTF8SKIP(s)) \
61 ? ((e) - (s)) \
62 : UTF8SKIP(s))
63#endif
64
e28192fd
KW
65#if !defined(my_strnlen)
66#if { NEED my_strnlen }
67
68STRLEN
69my_strnlen(const char *str, Size_t maxlen)
70{
71 const char *p = str;
72
73 while(maxlen-- && *p)
74 p++;
75
76 return p - str;
77}
78
79#endif
80#endif
4c28bdc5
KW
81#if defined(utf8n_to_uvchr)
82
83__UNDEFINED__ utf8_to_uvchr_buf(s,e,lp) (__ASSERT_(e >= s) \
84 utf8n_to_uvchr((s), ((e)-(s)), (lp), \
85 (UTF8_ALLOW_ANYUV & ~UTF8_ALLOW_LONG)))
86
87#elif defined(utf8_to_uv)
88
89__UNDEFINED__ utf8_to_uvchr_buf(s,e,lp) (__ASSERT_(e >= s) \
90 utf8_to_uv((s), ((e)-(s)), (lp), \
91 (UTF8_ALLOW_ANYUV & ~UTF8_ALLOW_LONG)))
92#endif
e28192fd 93
39d7245c
KW
94#undef utf8_to_uvchr
95
96/* Always redefine this unsafe function so that it refuses to read past a NUL,
97 * making it much less likely to read off the end of the buffer. A NUL
98 * indicates the start of the next character anyway. If the input isn't
99 * NUL-terminated, the function remains unsafe, as it always has been.
100 */
101
102__UNDEFINED__ utf8_to_uvchr(s, lp) \
103 ((*(s) == '\0') \
104 ? utf8_to_uvchr_buf(s,((s)+1), lp) /* Handle single NUL specially */ \
105 : utf8_to_uvchr_buf(s, (s) + my_strnlen((char *) (s), UTF8SKIP(s)), (lp)))
106
e28192fd
KW
107=xsinit
108
109#define NEED_my_strnlen
110
adfe19db
MHM
111=xsubs
112
113SV *
114sv_setuv(uv)
b2049988
MHM
115 UV uv
116 CODE:
117 RETVAL = newSViv(1);
118 sv_setuv(RETVAL, uv);
119 OUTPUT:
120 RETVAL
adfe19db
MHM
121
122SV *
123newSVuv(uv)
b2049988
MHM
124 UV uv
125 CODE:
126 RETVAL = newSVuv(uv);
127 OUTPUT:
128 RETVAL
adfe19db
MHM
129
130UV
131sv_2uv(sv)
b2049988
MHM
132 SV *sv
133 CODE:
134 RETVAL = sv_2uv(sv);
135 OUTPUT:
136 RETVAL
adfe19db
MHM
137
138UV
139SvUVx(sv)
b2049988
MHM
140 SV *sv
141 CODE:
142 sv--;
143 RETVAL = SvUVx(++sv);
144 OUTPUT:
145 RETVAL
adfe19db
MHM
146
147void
148XSRETURN_UV()
b2049988
MHM
149 PPCODE:
150 XSRETURN_UV(42);
adfe19db 151
96ad942f
MHM
152void
153PUSHu()
b2049988
MHM
154 PREINIT:
155 dTARG;
156 PPCODE:
157 TARG = sv_newmortal();
158 EXTEND(SP, 1);
159 PUSHu(42);
160 XSRETURN(1);
96ad942f
MHM
161
162void
163XPUSHu()
b2049988
MHM
164 PREINIT:
165 dTARG;
166 PPCODE:
167 TARG = sv_newmortal();
168 XPUSHu(43);
169 XSRETURN(1);
96ad942f 170
f2e3e4ce
KW
171STRLEN
172UTF8_SAFE_SKIP(s, adjustment)
173 unsigned char * s
174 int adjustment
175 CODE:
176 /* Instead of passing in an 'e' ptr, use the real end, adjusted */
177 RETVAL = UTF8_SAFE_SKIP(s, s + UTF8SKIP(s) + adjustment);
178 OUTPUT:
179 RETVAL
180
e28192fd
KW
181STRLEN
182my_strnlen(s, max)
183 char * s
184 STRLEN max
185 CODE:
186 RETVAL= my_strnlen(s, max);
187 OUTPUT:
188 RETVAL
189
4c28bdc5
KW
190AV *
191utf8_to_uvchr_buf(s)
192 unsigned char *s
193 PREINIT:
194 AV *av;
195 STRLEN len;
196 CODE:
197 av = newAV();
198 av_push(av, newSVuv(utf8_to_uvchr_buf(s, s + UTF8SKIP(s), &len)));
199 av_push(av, newSVuv(len));
200 RETVAL = av;
201 OUTPUT:
202 RETVAL
203
39d7245c
KW
204AV *
205utf8_to_uvchr(s)
206 unsigned char *s
207 PREINIT:
208 AV *av;
209 STRLEN len;
210 CODE:
211 av = newAV();
212 av_push(av, newSVuv(utf8_to_uvchr(s, &len)));
213 av_push(av, newSVuv(len));
214 RETVAL = av;
215 OUTPUT:
216 RETVAL
217
218=tests plan => 21
adfe19db
MHM
219
220ok(&Devel::PPPort::sv_setuv(42), 42);
221ok(&Devel::PPPort::newSVuv(123), 123);
222ok(&Devel::PPPort::sv_2uv("4711"), 4711);
223ok(&Devel::PPPort::sv_2uv("1735928559"), 1735928559);
224ok(&Devel::PPPort::SvUVx("1735928559"), 1735928559);
225ok(&Devel::PPPort::SvUVx(1735928559), 1735928559);
226ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
227ok(&Devel::PPPort::XSRETURN_UV(), 42);
96ad942f
MHM
228ok(&Devel::PPPort::PUSHu(), 42);
229ok(&Devel::PPPort::XPUSHu(), 43);
f2e3e4ce
KW
230ok(&Devel::PPPort::UTF8_SAFE_SKIP("A", 0), 1);
231ok(&Devel::PPPort::UTF8_SAFE_SKIP("A", -1), 0);
e28192fd 232ok(&Devel::PPPort::my_strnlen("abc\0def", 7), 3);
4c28bdc5
KW
233my $ret = &Devel::PPPort::utf8_to_uvchr_buf("A");
234ok($ret->[0], ord("A"));
235ok($ret->[1], 1);
236$ret = &Devel::PPPort::utf8_to_uvchr_buf("\0");
237ok($ret->[0], 0);
238ok($ret->[1], 1);
39d7245c
KW
239$ret = &Devel::PPPort::utf8_to_uvchr("A");
240ok($ret->[0], ord("A"));
241ok($ret->[1], 1);
242$ret = &Devel::PPPort::utf8_to_uvchr("\0");
243ok($ret->[0], 0);
244ok($ret->[1], 1);