This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update Devel-PPPort to match 3.67
[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
aadf4f9e 17
adfe19db
MHM
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 30
46677718 31#if defined(PERL_USE_GCC_BRACE_GROUPS)
4cda2410
P
32__UNDEFINED__ sv_2uv(sv) ({ SV *_sv = (sv); (UV) (SvNOK(_sv) ? SvNV(_sv) : sv_2nv(_sv)); })
33#else
adfe19db 34__UNDEFINED__ sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
4cda2410
P
35#endif
36
adfe19db
MHM
37__UNDEFINED__ SvUVX(sv) ((UV)SvIVX(sv))
38__UNDEFINED__ SvUVXx(sv) SvUVX(sv)
39__UNDEFINED__ SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
4cda2410 40
46677718 41#if defined(PERL_USE_GCC_BRACE_GROUPS)
4cda2410
P
42__UNDEFINED__ SvUVx(sv) ({ SV *_sv = (sv)); SvUV(_sv); })
43#else
adfe19db 44__UNDEFINED__ SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
4cda2410 45#endif
adfe19db
MHM
46
47/* Hint: sv_uv
48 * Always use the SvUVx() macro instead of sv_uv().
49 */
c4e3740a 50/* Replace sv_uv with SvUVx */
adfe19db
MHM
51__UNDEFINED__ sv_uv(sv) SvUVx(sv)
52
679ad62d
MHM
53#if !defined(SvUOK) && defined(SvIOK_UV)
54# define SvUOK(sv) SvIOK_UV(sv)
55#endif
56
adfe19db
MHM
57__UNDEFINED__ XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
58__UNDEFINED__ XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END
59
96ad942f
MHM
60__UNDEFINED__ PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
61__UNDEFINED__ XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
62
e28192fd
KW
63#if !defined(my_strnlen)
64#if { NEED my_strnlen }
65
4401d04f 66Size_t
e28192fd
KW
67my_strnlen(const char *str, Size_t maxlen)
68{
69 const char *p = str;
70
71 while(maxlen-- && *p)
72 p++;
73
74 return p - str;
75}
76
77#endif
78#endif
4c28bdc5 79
e28192fd
KW
80=xsinit
81
82#define NEED_my_strnlen
83
adfe19db
MHM
84=xsubs
85
86SV *
87sv_setuv(uv)
b2049988
MHM
88 UV uv
89 CODE:
90 RETVAL = newSViv(1);
91 sv_setuv(RETVAL, uv);
92 OUTPUT:
93 RETVAL
adfe19db
MHM
94
95SV *
96newSVuv(uv)
b2049988
MHM
97 UV uv
98 CODE:
99 RETVAL = newSVuv(uv);
100 OUTPUT:
101 RETVAL
adfe19db
MHM
102
103UV
104sv_2uv(sv)
b2049988
MHM
105 SV *sv
106 CODE:
107 RETVAL = sv_2uv(sv);
108 OUTPUT:
109 RETVAL
adfe19db
MHM
110
111UV
112SvUVx(sv)
b2049988
MHM
113 SV *sv
114 CODE:
115 sv--;
116 RETVAL = SvUVx(++sv);
117 OUTPUT:
118 RETVAL
adfe19db
MHM
119
120void
121XSRETURN_UV()
b2049988
MHM
122 PPCODE:
123 XSRETURN_UV(42);
adfe19db 124
96ad942f
MHM
125void
126PUSHu()
b2049988
MHM
127 PREINIT:
128 dTARG;
129 PPCODE:
130 TARG = sv_newmortal();
131 EXTEND(SP, 1);
132 PUSHu(42);
133 XSRETURN(1);
96ad942f
MHM
134
135void
136XPUSHu()
b2049988
MHM
137 PREINIT:
138 dTARG;
139 PPCODE:
140 TARG = sv_newmortal();
141 XPUSHu(43);
142 XSRETURN(1);
96ad942f 143
e28192fd
KW
144STRLEN
145my_strnlen(s, max)
146 char * s
147 STRLEN max
148 CODE:
149 RETVAL= my_strnlen(s, max);
150 OUTPUT:
151 RETVAL
152
5ef77e59 153=tests plan => 11
adfe19db 154
c8799aff 155BEGIN { require warnings if ivers($]) > ivers('5.006') }
933ffe6b 156
8154c0b1
KW
157is(&Devel::PPPort::sv_setuv(42), 42);
158is(&Devel::PPPort::newSVuv(123), 123);
159is(&Devel::PPPort::sv_2uv("4711"), 4711);
160is(&Devel::PPPort::sv_2uv("1735928559"), 1735928559);
161is(&Devel::PPPort::SvUVx("1735928559"), 1735928559);
162is(&Devel::PPPort::SvUVx(1735928559), 1735928559);
163is(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
164is(&Devel::PPPort::XSRETURN_UV(), 42);
165is(&Devel::PPPort::PUSHu(), 42);
166is(&Devel::PPPort::XPUSHu(), 43);
167is(&Devel::PPPort::my_strnlen("abc\0def", 7), 3);