uv revision 1.1
1################################################################################
2##
3##  Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
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
14__UNDEFINED__
15SvUOK
16
17=implementation
18
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))
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
41#if !defined(SvUOK) && defined(SvIOK_UV)
42#  define SvUOK(sv) SvIOK_UV(sv)
43#endif
44
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
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
51=xsubs
52
53SV *
54sv_setuv(uv)
55        UV uv
56        CODE:
57                RETVAL = newSViv(1);
58                sv_setuv(RETVAL, uv);
59        OUTPUT:
60                RETVAL
61
62SV *
63newSVuv(uv)
64        UV uv
65        CODE:
66                RETVAL = newSVuv(uv);
67        OUTPUT:
68                RETVAL
69
70UV
71sv_2uv(sv)
72        SV *sv
73        CODE:
74                RETVAL = sv_2uv(sv);
75        OUTPUT:
76                RETVAL
77
78UV
79SvUVx(sv)
80        SV *sv
81        CODE:
82                sv--;
83                RETVAL = SvUVx(++sv);
84        OUTPUT:
85                RETVAL
86
87void
88XSRETURN_UV()
89        PPCODE:
90                XSRETURN_UV(42);
91
92void
93PUSHu()
94        PREINIT:
95                dTARG;
96        PPCODE:
97                TARG = sv_newmortal();
98                EXTEND(SP, 1);
99                PUSHu(42);
100                XSRETURN(1);
101
102void
103XPUSHu()
104        PREINIT:
105                dTARG;
106        PPCODE:
107                TARG = sv_newmortal();
108                XPUSHu(43);
109                XSRETURN(1);
110
111=tests plan => 10
112
113ok(&Devel::PPPort::sv_setuv(42), 42);
114ok(&Devel::PPPort::newSVuv(123), 123);
115ok(&Devel::PPPort::sv_2uv("4711"), 4711);
116ok(&Devel::PPPort::sv_2uv("1735928559"), 1735928559);
117ok(&Devel::PPPort::SvUVx("1735928559"), 1735928559);
118ok(&Devel::PPPort::SvUVx(1735928559), 1735928559);
119ok(&Devel::PPPort::SvUVx(0xdeadbeef), 0xdeadbeef);
120ok(&Devel::PPPort::XSRETURN_UV(), 42);
121ok(&Devel::PPPort::PUSHu(), 42);
122ok(&Devel::PPPort::XPUSHu(), 43);
123