Commit | Line | Data |
adfe19db |
1 | ################################################################################ |
2 | ## |
0d0f8426 |
3 | ## $Revision: 12 $ |
adfe19db |
4 | ## $Author: mhx $ |
0d0f8426 |
5 | ## $Date: 2006/01/14 18:08:01 +0100 $ |
adfe19db |
6 | ## |
7 | ################################################################################ |
8 | ## |
0d0f8426 |
9 | ## Version 3.x, Copyright (C) 2004-2006, Marcus Holland-Moritz. |
adfe19db |
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 | |
adfe19db |
20 | __UNDEFINED__ |
21 | |
22 | =implementation |
23 | |
0d0f8426 |
24 | __UNDEFINED__ sv_setuv(sv, uv) \ |
25 | STMT_START { \ |
26 | UV TeMpUv = uv; \ |
27 | if (TeMpUv <= IV_MAX) \ |
28 | sv_setiv(sv, TeMpUv); \ |
29 | else \ |
30 | sv_setnv(sv, (double)TeMpUv); \ |
31 | } STMT_END |
32 | |
33 | __UNDEFINED__ newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) |
adfe19db |
34 | |
35 | __UNDEFINED__ sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) |
36 | __UNDEFINED__ SvUVX(sv) ((UV)SvIVX(sv)) |
37 | __UNDEFINED__ SvUVXx(sv) SvUVX(sv) |
38 | __UNDEFINED__ SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) |
39 | __UNDEFINED__ SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) |
40 | |
41 | /* Hint: sv_uv |
42 | * Always use the SvUVx() macro instead of sv_uv(). |
43 | */ |
44 | __UNDEFINED__ sv_uv(sv) SvUVx(sv) |
45 | |
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 |
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 | |
adfe19db |
52 | =xsubs |
53 | |
54 | SV * |
55 | sv_setuv(uv) |
56 | UV uv |
57 | CODE: |
58 | RETVAL = newSViv(1); |
59 | sv_setuv(RETVAL, uv); |
60 | OUTPUT: |
61 | RETVAL |
62 | |
63 | SV * |
64 | newSVuv(uv) |
65 | UV uv |
66 | CODE: |
67 | RETVAL = newSVuv(uv); |
68 | OUTPUT: |
69 | RETVAL |
70 | |
71 | UV |
72 | sv_2uv(sv) |
73 | SV *sv |
74 | CODE: |
75 | RETVAL = sv_2uv(sv); |
76 | OUTPUT: |
77 | RETVAL |
78 | |
79 | UV |
80 | SvUVx(sv) |
81 | SV *sv |
82 | CODE: |
83 | sv--; |
84 | RETVAL = SvUVx(++sv); |
85 | OUTPUT: |
86 | RETVAL |
87 | |
88 | void |
89 | XSRETURN_UV() |
90 | PPCODE: |
91 | XSRETURN_UV(42); |
92 | |
96ad942f |
93 | void |
94 | PUSHu() |
95 | PREINIT: |
96 | dTARG; |
97 | PPCODE: |
98 | TARG = sv_newmortal(); |
99 | EXTEND(SP, 1); |
100 | PUSHu(42); |
101 | XSRETURN(1); |
102 | |
103 | void |
104 | XPUSHu() |
105 | PREINIT: |
106 | dTARG; |
107 | PPCODE: |
108 | TARG = sv_newmortal(); |
109 | XPUSHu(43); |
110 | XSRETURN(1); |
111 | |
112 | =tests plan => 10 |
adfe19db |
113 | |
114 | ok(&Devel::PPPort::sv_setuv(42), 42); |
115 | ok(&Devel::PPPort::newSVuv(123), 123); |
116 | ok(&Devel::PPPort::sv_2uv("4711"), 4711); |
117 | ok(&Devel::PPPort::sv_2uv("1735928559"), 1735928559); |
118 | ok(&Devel::PPPort::SvUVx("1735928559"), 1735928559); |
119 | ok(&Devel::PPPort::SvUVx(1735928559), 1735928559); |
120 | ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef); |
121 | ok(&Devel::PPPort::XSRETURN_UV(), 42); |
96ad942f |
122 | ok(&Devel::PPPort::PUSHu(), 42); |
123 | ok(&Devel::PPPort::XPUSHu(), 43); |
adfe19db |
124 | |