]>
Commit | Line | Data |
---|---|---|
096619f2 MG |
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: 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 <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 | |
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 | } |