File Coverage

ext/perl_math_int64/perl_math_int64.c
Criterion Covered Total %
statement 36 58 62.0
branch 47 218 21.5
condition n/a
subroutine n/a
pod n/a
total 83 276 30.0


line stmt bran cond sub pod time code
1             /*
2             * perl_math_int64.c - This file is in the public domain
3             * Author: "Salvador Fandino , Dave Rolsky "
4             *
5             * Generated on: 2016-01-04 10:07:18
6             * Math::Int64 version: 0.54
7             * Module::CAPIMaker version:
8             */
9              
10             #include "EXTERN.h"
11             #include "perl.h"
12             #include "ppport.h"
13              
14             #ifdef __MINGW32__
15             #include
16             #endif
17              
18             #ifdef _MSC_VER
19             #include
20             typedef __int64 int64_t;
21             typedef unsigned __int64 uint64_t;
22             #endif
23              
24             /* you may need to add a typemap for int64_t here if it is not defined
25             by default in your C header files */
26              
27             HV *math_int64_c_api_hash;
28             int math_int64_c_api_min_version;
29             int math_int64_c_api_max_version;
30              
31             int64_t (*math_int64_c_api_SvI64)(pTHX_ SV*);
32             int (*math_int64_c_api_SvI64OK)(pTHX_ SV*);
33             uint64_t (*math_int64_c_api_SvU64)(pTHX_ SV*);
34             int (*math_int64_c_api_SvU64OK)(pTHX_ SV*);
35             SV * (*math_int64_c_api_newSVi64)(pTHX_ int64_t);
36             SV * (*math_int64_c_api_newSVu64)(pTHX_ uint64_t);
37             uint64_t (*math_int64_c_api_randU64)(pTHX);
38              
39             int
40 13           perl_math_int64_load(int required_version) {
41             dTHX;
42             SV **svp;
43 13           eval_pv("require Math::Int64", TRUE);
44 13 50         if (SvTRUE(ERRSV)) return 0;
    50          
    50          
    50          
    0          
    50          
    50          
    0          
    0          
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
45              
46 13           math_int64_c_api_hash = get_hv("Math::Int64::C_API", 0);
47 13 50         if (!math_int64_c_api_hash) {
48 0 0         sv_setpv(ERRSV, "Unable to load Math::Int64 C API");
49 0 0         SvSETMAGIC(ERRSV);
    0          
    0          
50             return 0;
51             }
52              
53 13           svp = hv_fetch(math_int64_c_api_hash, "min_version", 11, 0);
54 13 50         if (!svp) svp = hv_fetch(math_int64_c_api_hash, "version", 7, 1);
55 13 50         if (!svp || !*svp) {
    50          
56 0 0         sv_setpv(ERRSV, "Unable to retrieve C API version for Math::Int64");
57 0 0         SvSETMAGIC(ERRSV);
    0          
    0          
58             return 0;
59             }
60 13 50         math_int64_c_api_min_version = SvIV(*svp);
61              
62 13           svp = hv_fetch(math_int64_c_api_hash, "max_version", 11, 0);
63 13 50         if (!svp) svp = hv_fetch(math_int64_c_api_hash, "version", 7, 1);
64 13 50         if (!svp || !*svp) {
    50          
65 0 0         sv_setpv(ERRSV, "Unable to retrieve C API version for Math::Int64");
66 0 0         SvSETMAGIC(ERRSV);
    0          
    0          
67             return 0;
68             }
69 13 50         math_int64_c_api_max_version = SvIV(*svp);
70              
71 13 50         if ((required_version < math_int64_c_api_min_version) ||
    50          
72             (required_version > math_int64_c_api_max_version)) {
73 0 0         sv_setpvf(ERRSV,
74             "Math::Int64 C API version mismatch. "
75             "The installed module supports versions %d to %d but %d is required",
76             math_int64_c_api_min_version,
77             math_int64_c_api_max_version,
78             required_version);
79 0 0         SvSETMAGIC(ERRSV);
    0          
    0          
80             return 0;
81             }
82              
83 13           svp = hv_fetch(math_int64_c_api_hash, "SvI64", 5, 0);
84 13 50         if (!svp || !*svp) {
    50          
85 0 0         sv_setpv(ERRSV, "Unable to fetch pointer 'SvI64' C function from Math::Int64");
86 0 0         SvSETMAGIC(ERRSV);
    0          
    0          
87             return 0;
88             }
89 13 50         math_int64_c_api_SvI64 = INT2PTR(void *, SvIV(*svp));
90 13           svp = hv_fetch(math_int64_c_api_hash, "SvI64OK", 7, 0);
91 13 50         if (!svp || !*svp) {
    50          
92 0 0         sv_setpv(ERRSV, "Unable to fetch pointer 'SvI64OK' C function from Math::Int64");
93 0 0         SvSETMAGIC(ERRSV);
    0          
    0          
94             return 0;
95             }
96 13 50         math_int64_c_api_SvI64OK = INT2PTR(void *, SvIV(*svp));
97 13           svp = hv_fetch(math_int64_c_api_hash, "SvU64", 5, 0);
98 13 50         if (!svp || !*svp) {
    50          
99 0 0         sv_setpv(ERRSV, "Unable to fetch pointer 'SvU64' C function from Math::Int64");
100 0 0         SvSETMAGIC(ERRSV);
    0          
    0          
101             return 0;
102             }
103 13 50         math_int64_c_api_SvU64 = INT2PTR(void *, SvIV(*svp));
104 13           svp = hv_fetch(math_int64_c_api_hash, "SvU64OK", 7, 0);
105 13 50         if (!svp || !*svp) {
    50          
106 0 0         sv_setpv(ERRSV, "Unable to fetch pointer 'SvU64OK' C function from Math::Int64");
107 0 0         SvSETMAGIC(ERRSV);
    0          
    0          
108             return 0;
109             }
110 13 50         math_int64_c_api_SvU64OK = INT2PTR(void *, SvIV(*svp));
111 13           svp = hv_fetch(math_int64_c_api_hash, "newSVi64", 8, 0);
112 13 50         if (!svp || !*svp) {
    50          
113 0 0         sv_setpv(ERRSV, "Unable to fetch pointer 'newSVi64' C function from Math::Int64");
114 0 0         SvSETMAGIC(ERRSV);
    0          
    0          
115             return 0;
116             }
117 13 50         math_int64_c_api_newSVi64 = INT2PTR(void *, SvIV(*svp));
118 13           svp = hv_fetch(math_int64_c_api_hash, "newSVu64", 8, 0);
119 13 50         if (!svp || !*svp) {
    50          
120 0 0         sv_setpv(ERRSV, "Unable to fetch pointer 'newSVu64' C function from Math::Int64");
121 0 0         SvSETMAGIC(ERRSV);
    0          
    0          
122             return 0;
123             }
124 13 50         math_int64_c_api_newSVu64 = INT2PTR(void *, SvIV(*svp));
125 13           svp = hv_fetch(math_int64_c_api_hash, "randU64", 7, 0);
126 13 50         if (!svp || !*svp) {
    50          
127 0 0         sv_setpv(ERRSV, "Unable to fetch pointer 'randU64' C function from Math::Int64");
128 0 0         SvSETMAGIC(ERRSV);
    0          
    0          
129             return 0;
130             }
131 13 50         math_int64_c_api_randU64 = INT2PTR(void *, SvIV(*svp));
132              
133 13           return 1;
134             }