Commit | Line | Data |
---|---|---|
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 | ||
14 | /^#\s*define\s+(\w+)/ | |
15 | ||
16 | =implementation | |
17 | ||
18 | #ifndef IVdf | |
19 | # if IVSIZE == LONGSIZE | |
b2049988 MHM |
20 | # define IVdf "ld" |
21 | # define UVuf "lu" | |
22 | # define UVof "lo" | |
23 | # define UVxf "lx" | |
24 | # define UVXf "lX" | |
25 | # elif IVSIZE == INTSIZE | |
26 | # define IVdf "d" | |
27 | # define UVuf "u" | |
28 | # define UVof "o" | |
29 | # define UVxf "x" | |
30 | # define UVXf "X" | |
adfe19db | 31 | # else |
b2049988 | 32 | # error "cannot define IV/UV formats" |
adfe19db MHM |
33 | # endif |
34 | #endif | |
35 | ||
36 | #ifndef NVef | |
37 | # if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \ | |
1d175cda MHM |
38 | defined(PERL_PRIfldbl) && { VERSION != 5.6.0 } |
39 | /* Not very likely, but let's try anyway. */ | |
adfe19db MHM |
40 | # define NVef PERL_PRIeldbl |
41 | # define NVff PERL_PRIfldbl | |
42 | # define NVgf PERL_PRIgldbl | |
43 | # else | |
44 | # define NVef "e" | |
45 | # define NVff "f" | |
46 | # define NVgf "g" | |
47 | # endif | |
48 | #endif | |
49 | ||
1d175cda MHM |
50 | =xsubs |
51 | ||
52 | void | |
53 | croak_NVgf(num) | |
b2049988 MHM |
54 | NV num |
55 | PPCODE: | |
56 | Perl_croak(aTHX_ "%.20" NVgf "\n", num); | |
1d175cda | 57 | |
bc4230ed P |
58 | SV * |
59 | sprintf_iv(iv) | |
60 | IV iv | |
61 | CODE: | |
62 | RETVAL = newSVpvf("XX_%" IVdf "_XX", iv); | |
63 | OUTPUT: | |
64 | RETVAL | |
65 | ||
66 | SV * | |
67 | sprintf_uv(uv) | |
68 | UV uv | |
69 | CODE: | |
70 | RETVAL = newSVpvf("XX_%" UVuf "_XX", uv); | |
71 | OUTPUT: | |
72 | RETVAL | |
73 | ||
74 | SV * | |
75 | sprintf_ivmax() | |
76 | CODE: | |
77 | RETVAL = newSVpvf("%" IVdf, IV_MAX); | |
78 | OUTPUT: | |
79 | RETVAL | |
80 | ||
81 | SV * | |
82 | sprintf_uvmax() | |
83 | CODE: | |
84 | RETVAL = newSVpvf("%" UVuf, UV_MAX); | |
85 | OUTPUT: | |
86 | RETVAL | |
87 | ||
88 | =tests plan => 5 | |
89 | ||
90 | use Config; | |
1d175cda MHM |
91 | |
92 | my $num = 1.12345678901234567890; | |
93 | ||
94 | eval { Devel::PPPort::croak_NVgf($num) }; | |
95 | ok($@ =~ /^1.1234567890/); | |
bc4230ed P |
96 | |
97 | ok(Devel::PPPort::sprintf_iv(-8), 'XX_-8_XX'); | |
98 | ok(Devel::PPPort::sprintf_uv(15), 'XX_15_XX'); | |
99 | ||
100 | my $ivsize = $Config::Config{ivsize}; | |
101 | my $ivmax = ($ivsize == 4) ? '2147483647' : ($ivsize == 8) ? '9223372036854775807' : 0; | |
102 | my $uvmax = ($ivsize == 4) ? '4294967295' : ($ivsize == 8) ? '18446744073709551615' : 0; | |
103 | if ($ivmax == 0) { | |
104 | skip 'skip: unknown ivsize', 0 for 1..2; | |
105 | } else { | |
106 | ok(Devel::PPPort::sprintf_ivmax(), $ivmax); | |
107 | ok(Devel::PPPort::sprintf_uvmax(), $uvmax); | |
108 | } |