Commit | Line | Data |
---|---|---|
adfe19db MHM |
1 | ################################################################################ |
2 | ## | |
9132e1a3 | 3 | ## $Revision: 10 $ |
adfe19db | 4 | ## $Author: mhx $ |
9132e1a3 | 5 | ## $Date: 2005/01/31 08:10:54 +0100 $ |
adfe19db MHM |
6 | ## |
7 | ################################################################################ | |
8 | ## | |
9132e1a3 | 9 | ## Version 3.x, Copyright (C) 2004-2005, Marcus Holland-Moritz. |
adfe19db MHM |
10 | ## Version 2.x, Copyright (C) 2001, Paul Marquess. |
11 | ## Version 1.x, Copyright (C) 1999, Kenneth Albanowski. | |
12 | ## | |
13 | ## This program is free software; you can redistribute it and/or | |
14 | ## modify it under the same terms as Perl itself. | |
15 | ## | |
16 | ################################################################################ | |
17 | ||
18 | =provides | |
19 | ||
20 | sv_setuv | |
21 | newSVuv | |
22 | __UNDEFINED__ | |
23 | ||
24 | =implementation | |
25 | ||
26 | #ifndef sv_setuv | |
27 | # define sv_setuv(sv, uv) \ | |
28 | STMT_START { \ | |
29 | UV TeMpUv = uv; \ | |
30 | if (TeMpUv <= IV_MAX) \ | |
31 | sv_setiv(sv, TeMpUv); \ | |
32 | else \ | |
33 | sv_setnv(sv, (double)TeMpUv); \ | |
34 | } STMT_END | |
35 | #endif | |
36 | ||
37 | #ifndef newSVuv | |
38 | # define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) | |
39 | #endif | |
40 | ||
41 | __UNDEFINED__ sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) | |
42 | __UNDEFINED__ SvUVX(sv) ((UV)SvIVX(sv)) | |
43 | __UNDEFINED__ SvUVXx(sv) SvUVX(sv) | |
44 | __UNDEFINED__ SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) | |
45 | __UNDEFINED__ SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) | |
46 | ||
47 | /* Hint: sv_uv | |
48 | * Always use the SvUVx() macro instead of sv_uv(). | |
49 | */ | |
50 | __UNDEFINED__ sv_uv(sv) SvUVx(sv) | |
51 | ||
52 | __UNDEFINED__ XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) | |
53 | __UNDEFINED__ XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END | |
54 | ||
96ad942f MHM |
55 | __UNDEFINED__ PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END |
56 | __UNDEFINED__ XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END | |
57 | ||
adfe19db MHM |
58 | =xsubs |
59 | ||
60 | SV * | |
61 | sv_setuv(uv) | |
62 | UV uv | |
63 | CODE: | |
64 | RETVAL = newSViv(1); | |
65 | sv_setuv(RETVAL, uv); | |
66 | OUTPUT: | |
67 | RETVAL | |
68 | ||
69 | SV * | |
70 | newSVuv(uv) | |
71 | UV uv | |
72 | CODE: | |
73 | RETVAL = newSVuv(uv); | |
74 | OUTPUT: | |
75 | RETVAL | |
76 | ||
77 | UV | |
78 | sv_2uv(sv) | |
79 | SV *sv | |
80 | CODE: | |
81 | RETVAL = sv_2uv(sv); | |
82 | OUTPUT: | |
83 | RETVAL | |
84 | ||
85 | UV | |
86 | SvUVx(sv) | |
87 | SV *sv | |
88 | CODE: | |
89 | sv--; | |
90 | RETVAL = SvUVx(++sv); | |
91 | OUTPUT: | |
92 | RETVAL | |
93 | ||
94 | void | |
95 | XSRETURN_UV() | |
96 | PPCODE: | |
97 | XSRETURN_UV(42); | |
98 | ||
96ad942f MHM |
99 | void |
100 | PUSHu() | |
101 | PREINIT: | |
102 | dTARG; | |
103 | PPCODE: | |
104 | TARG = sv_newmortal(); | |
105 | EXTEND(SP, 1); | |
106 | PUSHu(42); | |
107 | XSRETURN(1); | |
108 | ||
109 | void | |
110 | XPUSHu() | |
111 | PREINIT: | |
112 | dTARG; | |
113 | PPCODE: | |
114 | TARG = sv_newmortal(); | |
115 | XPUSHu(43); | |
116 | XSRETURN(1); | |
117 | ||
118 | =tests plan => 10 | |
adfe19db MHM |
119 | |
120 | ok(&Devel::PPPort::sv_setuv(42), 42); | |
121 | ok(&Devel::PPPort::newSVuv(123), 123); | |
122 | ok(&Devel::PPPort::sv_2uv("4711"), 4711); | |
123 | ok(&Devel::PPPort::sv_2uv("1735928559"), 1735928559); | |
124 | ok(&Devel::PPPort::SvUVx("1735928559"), 1735928559); | |
125 | ok(&Devel::PPPort::SvUVx(1735928559), 1735928559); | |
126 | ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef); | |
127 | ok(&Devel::PPPort::XSRETURN_UV(), 42); | |
96ad942f MHM |
128 | ok(&Devel::PPPort::PUSHu(), 42); |
129 | ok(&Devel::PPPort::XPUSHu(), 43); | |
adfe19db | 130 |