1 /*
2  * perl_math_int64.c - This file is in the public domain
3  * Author: Salvador Fandino <sfandino@yahoo.com>, Dave Rolsky <autarch@urth.org>
4  *
5  * Generated on: 2015-03-11 11:06:11
6  * Math::Int64 version: 0.51
7  * Module::CAPIMaker version:
8  */
9 
10 #include "EXTERN.h"
11 #include "perl.h"
12 #include "ppport.h"
13 
14 #ifdef __MINGW32__
15 #include <stdint.h>
16 #endif
17 
18 #ifdef _MSC_VER
19 #include <stdlib.h>
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
perl_math_int64_load(int required_version)40 perl_math_int64_load(int required_version) {
41     dTHX;
42     SV **svp;
43     eval_pv("require Math::Int64", TRUE);
44     if (SvTRUE(ERRSV)) return 0;
45 
46    math_int64_c_api_hash = get_hv("Math::Int64::C_API", 0);
47     if (!math_int64_c_api_hash) {
48         sv_setpv(ERRSV, "Unable to load Math::Int64 C API");
49         SvSETMAGIC(ERRSV);
50         return 0;
51     }
52 
53     svp = hv_fetch(math_int64_c_api_hash, "min_version", 11, 0);
54     if (!svp) svp = hv_fetch(math_int64_c_api_hash, "version", 7, 1);
55     if (!svp || !*svp) {
56         sv_setpv(ERRSV, "Unable to retrieve C API version for Math::Int64");
57         SvSETMAGIC(ERRSV);
58         return 0;
59     }
60     math_int64_c_api_min_version = SvIV(*svp);
61 
62     svp = hv_fetch(math_int64_c_api_hash, "max_version", 11, 0);
63     if (!svp) svp = hv_fetch(math_int64_c_api_hash, "version", 7, 1);
64     if (!svp || !*svp) {
65         sv_setpv(ERRSV, "Unable to retrieve C API version for Math::Int64");
66         SvSETMAGIC(ERRSV);
67         return 0;
68     }
69     math_int64_c_api_max_version = SvIV(*svp);
70 
71     if ((required_version < math_int64_c_api_min_version) ||
72         (required_version > math_int64_c_api_max_version)) {
73         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         SvSETMAGIC(ERRSV);
80         return 0;
81     }
82 
83     svp = hv_fetch(math_int64_c_api_hash, "SvI64", 5, 0);
84     if (!svp || !*svp) {
85         sv_setpv(ERRSV, "Unable to fetch pointer 'SvI64' C function from Math::Int64");
86         SvSETMAGIC(ERRSV);
87         return 0;
88     }
89     math_int64_c_api_SvI64 = INT2PTR(void *, SvIV(*svp));
90     svp = hv_fetch(math_int64_c_api_hash, "SvI64OK", 7, 0);
91     if (!svp || !*svp) {
92         sv_setpv(ERRSV, "Unable to fetch pointer 'SvI64OK' C function from Math::Int64");
93         SvSETMAGIC(ERRSV);
94         return 0;
95     }
96     math_int64_c_api_SvI64OK = INT2PTR(void *, SvIV(*svp));
97     svp = hv_fetch(math_int64_c_api_hash, "SvU64", 5, 0);
98     if (!svp || !*svp) {
99         sv_setpv(ERRSV, "Unable to fetch pointer 'SvU64' C function from Math::Int64");
100         SvSETMAGIC(ERRSV);
101         return 0;
102     }
103     math_int64_c_api_SvU64 = INT2PTR(void *, SvIV(*svp));
104     svp = hv_fetch(math_int64_c_api_hash, "SvU64OK", 7, 0);
105     if (!svp || !*svp) {
106         sv_setpv(ERRSV, "Unable to fetch pointer 'SvU64OK' C function from Math::Int64");
107         SvSETMAGIC(ERRSV);
108         return 0;
109     }
110     math_int64_c_api_SvU64OK = INT2PTR(void *, SvIV(*svp));
111     svp = hv_fetch(math_int64_c_api_hash, "newSVi64", 8, 0);
112     if (!svp || !*svp) {
113         sv_setpv(ERRSV, "Unable to fetch pointer 'newSVi64' C function from Math::Int64");
114         SvSETMAGIC(ERRSV);
115         return 0;
116     }
117     math_int64_c_api_newSVi64 = INT2PTR(void *, SvIV(*svp));
118     svp = hv_fetch(math_int64_c_api_hash, "newSVu64", 8, 0);
119     if (!svp || !*svp) {
120         sv_setpv(ERRSV, "Unable to fetch pointer 'newSVu64' C function from Math::Int64");
121         SvSETMAGIC(ERRSV);
122         return 0;
123     }
124     math_int64_c_api_newSVu64 = INT2PTR(void *, SvIV(*svp));
125     svp = hv_fetch(math_int64_c_api_hash, "randU64", 7, 0);
126     if (!svp || !*svp) {
127         sv_setpv(ERRSV, "Unable to fetch pointer 'randU64' C function from Math::Int64");
128         SvSETMAGIC(ERRSV);
129         return 0;
130     }
131     math_int64_c_api_randU64 = INT2PTR(void *, SvIV(*svp));
132 
133     return 1;
134 }
135