Upgrade to Devel::PPPort 3.07
[p5sagit/p5-mst-13.2.git] / ext / Devel / PPPort / parts / inc / uv
1 ################################################################################
2 ##
3 ##  $Revision: 12 $
4 ##  $Author: mhx $
5 ##  $Date: 2006/01/14 18:08:01 +0100 $
6 ##
7 ################################################################################
8 ##
9 ##  Version 3.x, Copyright (C) 2004-2006, Marcus Holland-Moritz.
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 __UNDEFINED__
21
22 =implementation
23
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))
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
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
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
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
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);
122 ok(&Devel::PPPort::PUSHu(), 42);
123 ok(&Devel::PPPort::XPUSHu(), 43);
124