| 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 | } |