This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Provide UTF8_SAFE_SKIP
[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__
679ad62d 15SvUOK
adfe19db
MHM
16
17=implementation
18
0d0f8426
MHM
19__UNDEFINED__ sv_setuv(sv, uv) \
20 STMT_START { \
21 UV TeMpUv = uv; \
22 if (TeMpUv <= IV_MAX) \
23 sv_setiv(sv, TeMpUv); \
24 else \
25 sv_setnv(sv, (double)TeMpUv); \
26 } STMT_END
27
28__UNDEFINED__ newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
adfe19db
MHM
29
30__UNDEFINED__ sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
31__UNDEFINED__ SvUVX(sv) ((UV)SvIVX(sv))
32__UNDEFINED__ SvUVXx(sv) SvUVX(sv)
33__UNDEFINED__ SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
34__UNDEFINED__ SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
35
36/* Hint: sv_uv
37 * Always use the SvUVx() macro instead of sv_uv().
38 */
39__UNDEFINED__ sv_uv(sv) SvUVx(sv)
40
679ad62d
MHM
41#if !defined(SvUOK) && defined(SvIOK_UV)
42# define SvUOK(sv) SvIOK_UV(sv)
43#endif
44
adfe19db
MHM
45__UNDEFINED__ XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
46__UNDEFINED__ XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END
47
96ad942f
MHM
48__UNDEFINED__ PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
49__UNDEFINED__ XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
50
f2e3e4ce
KW
51#if defined UTF8SKIP
52__UNDEFINED__ UTF8_SAFE_SKIP(s, e) (__ASSERT_((e) >= (s)) \
53 ((e) - (s)) <= 0 \
54 ? 0 \
55 : (((e) - (s)) >= UTF8SKIP(s)) \
56 ? ((e) - (s)) \
57 : UTF8SKIP(s))
58#endif
59
adfe19db
MHM
60=xsubs
61
62SV *
63sv_setuv(uv)
b2049988
MHM
64 UV uv
65 CODE:
66 RETVAL = newSViv(1);
67 sv_setuv(RETVAL, uv);
68 OUTPUT:
69 RETVAL
adfe19db
MHM
70
71SV *
72newSVuv(uv)
b2049988
MHM
73 UV uv
74 CODE:
75 RETVAL = newSVuv(uv);
76 OUTPUT:
77 RETVAL
adfe19db
MHM
78
79UV
80sv_2uv(sv)
b2049988
MHM
81 SV *sv
82 CODE:
83 RETVAL = sv_2uv(sv);
84 OUTPUT:
85 RETVAL
adfe19db
MHM
86
87UV
88SvUVx(sv)
b2049988
MHM
89 SV *sv
90 CODE:
91 sv--;
92 RETVAL = SvUVx(++sv);
93 OUTPUT:
94 RETVAL
adfe19db
MHM
95
96void
97XSRETURN_UV()
b2049988
MHM
98 PPCODE:
99 XSRETURN_UV(42);
adfe19db 100
96ad942f
MHM
101void
102PUSHu()
b2049988
MHM
103 PREINIT:
104 dTARG;
105 PPCODE:
106 TARG = sv_newmortal();
107 EXTEND(SP, 1);
108 PUSHu(42);
109 XSRETURN(1);
96ad942f
MHM
110
111void
112XPUSHu()
b2049988
MHM
113 PREINIT:
114 dTARG;
115 PPCODE:
116 TARG = sv_newmortal();
117 XPUSHu(43);
118 XSRETURN(1);
96ad942f 119
f2e3e4ce
KW
120STRLEN
121UTF8_SAFE_SKIP(s, adjustment)
122 unsigned char * s
123 int adjustment
124 CODE:
125 /* Instead of passing in an 'e' ptr, use the real end, adjusted */
126 RETVAL = UTF8_SAFE_SKIP(s, s + UTF8SKIP(s) + adjustment);
127 OUTPUT:
128 RETVAL
129
130=tests plan => 12
adfe19db
MHM
131
132ok(&Devel::PPPort::sv_setuv(42), 42);
133ok(&Devel::PPPort::newSVuv(123), 123);
134ok(&Devel::PPPort::sv_2uv("4711"), 4711);
135ok(&Devel::PPPort::sv_2uv("1735928559"), 1735928559);
136ok(&Devel::PPPort::SvUVx("1735928559"), 1735928559);
137ok(&Devel::PPPort::SvUVx(1735928559), 1735928559);
138ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
139ok(&Devel::PPPort::XSRETURN_UV(), 42);
96ad942f
MHM
140ok(&Devel::PPPort::PUSHu(), 42);
141ok(&Devel::PPPort::XPUSHu(), 43);
f2e3e4ce
KW
142ok(&Devel::PPPort::UTF8_SAFE_SKIP("A", 0), 1);
143ok(&Devel::PPPort::UTF8_SAFE_SKIP("A", -1), 0);