diff options
author | Thierry Vignaud <thierry.vignaud@gmail.com> | 2016-10-18 03:09:59 +0200 |
---|---|---|
committer | Thierry Vignaud <thierry.vignaud@gmail.com> | 2016-10-18 04:13:05 +0200 |
commit | 12ff33c3fbf1dfc2dce60f6a75bb546ca3bf6735 (patch) | |
tree | 8ca1a0c942a613659593ba57fe69d2dce370e9f9 /perl_math_int64.c | |
parent | db118471a871d0ca2af9b178b2f6e910e30fb0a6 (diff) | |
download | perl-URPM-12ff33c3fbf1dfc2dce60f6a75bb546ca3bf6735.tar perl-URPM-12ff33c3fbf1dfc2dce60f6a75bb546ca3bf6735.tar.gz perl-URPM-12ff33c3fbf1dfc2dce60f6a75bb546ca3bf6735.tar.bz2 perl-URPM-12ff33c3fbf1dfc2dce60f6a75bb546ca3bf6735.tar.xz perl-URPM-12ff33c3fbf1dfc2dce60f6a75bb546ca3bf6735.zip |
add support for int64, using Math::Int64 C API
previously it was missing on 32bit arches
Diffstat (limited to 'perl_math_int64.c')
-rw-r--r-- | perl_math_int64.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/perl_math_int64.c b/perl_math_int64.c new file mode 100644 index 0000000..2125ec1 --- /dev/null +++ b/perl_math_int64.c @@ -0,0 +1,134 @@ +/* + * perl_math_int64.c - This file is in the public domain + * Author: "Salvador Fandino <sfandino@yahoo.com>, Dave Rolsky <autarch@urth.org>" + * + * Generated on: 2016-01-04 10:07:18 + * Math::Int64 version: 0.54 + * Module::CAPIMaker version: + */ + +#include "EXTERN.h" +#include "perl.h" +//#include "ppport.h" + +#ifdef __MINGW32__ +#include <stdint.h> +#endif + +#ifdef _MSC_VER +#include <stdlib.h> +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#endif + +/* you may need to add a typemap for int64_t here if it is not defined + by default in your C header files */ + +HV *math_int64_c_api_hash; +int math_int64_c_api_min_version; +int math_int64_c_api_max_version; + +int64_t (*math_int64_c_api_SvI64)(pTHX_ SV*); +int (*math_int64_c_api_SvI64OK)(pTHX_ SV*); +uint64_t (*math_int64_c_api_SvU64)(pTHX_ SV*); +int (*math_int64_c_api_SvU64OK)(pTHX_ SV*); +SV * (*math_int64_c_api_newSVi64)(pTHX_ int64_t); +SV * (*math_int64_c_api_newSVu64)(pTHX_ uint64_t); +uint64_t (*math_int64_c_api_randU64)(pTHX); + +int +perl_math_int64_load(int required_version) { + dTHX; + SV **svp; + eval_pv("require Math::Int64", TRUE); + if (SvTRUE(ERRSV)) return 0; + + math_int64_c_api_hash = get_hv("Math::Int64::C_API", 0); + if (!math_int64_c_api_hash) { + sv_setpv(ERRSV, "Unable to load Math::Int64 C API"); + SvSETMAGIC(ERRSV); + return 0; + } + + svp = hv_fetch(math_int64_c_api_hash, "min_version", 11, 0); + if (!svp) svp = hv_fetch(math_int64_c_api_hash, "version", 7, 1); + if (!svp || !*svp) { + sv_setpv(ERRSV, "Unable to retrieve C API version for Math::Int64"); + SvSETMAGIC(ERRSV); + return 0; + } + math_int64_c_api_min_version = SvIV(*svp); + + svp = hv_fetch(math_int64_c_api_hash, "max_version", 11, 0); + if (!svp) svp = hv_fetch(math_int64_c_api_hash, "version", 7, 1); + if (!svp || !*svp) { + sv_setpv(ERRSV, "Unable to retrieve C API version for Math::Int64"); + SvSETMAGIC(ERRSV); + return 0; + } + math_int64_c_api_max_version = SvIV(*svp); + + if ((required_version < math_int64_c_api_min_version) || + (required_version > math_int64_c_api_max_version)) { + sv_setpvf(ERRSV, + "Math::Int64 C API version mismatch. " + "The installed module supports versions %d to %d but %d is required", + math_int64_c_api_min_version, + math_int64_c_api_max_version, + required_version); + SvSETMAGIC(ERRSV); + return 0; + } + + svp = hv_fetch(math_int64_c_api_hash, "SvI64", 5, 0); + if (!svp || !*svp) { + sv_setpv(ERRSV, "Unable to fetch pointer 'SvI64' C function from Math::Int64"); + SvSETMAGIC(ERRSV); + return 0; + } + math_int64_c_api_SvI64 = INT2PTR(void *, SvIV(*svp)); + svp = hv_fetch(math_int64_c_api_hash, "SvI64OK", 7, 0); + if (!svp || !*svp) { + sv_setpv(ERRSV, "Unable to fetch pointer 'SvI64OK' C function from Math::Int64"); + SvSETMAGIC(ERRSV); + return 0; + } + math_int64_c_api_SvI64OK = INT2PTR(void *, SvIV(*svp)); + svp = hv_fetch(math_int64_c_api_hash, "SvU64", 5, 0); + if (!svp || !*svp) { + sv_setpv(ERRSV, "Unable to fetch pointer 'SvU64' C function from Math::Int64"); + SvSETMAGIC(ERRSV); + return 0; + } + math_int64_c_api_SvU64 = INT2PTR(void *, SvIV(*svp)); + svp = hv_fetch(math_int64_c_api_hash, "SvU64OK", 7, 0); + if (!svp || !*svp) { + sv_setpv(ERRSV, "Unable to fetch pointer 'SvU64OK' C function from Math::Int64"); + SvSETMAGIC(ERRSV); + return 0; + } + math_int64_c_api_SvU64OK = INT2PTR(void *, SvIV(*svp)); + svp = hv_fetch(math_int64_c_api_hash, "newSVi64", 8, 0); + if (!svp || !*svp) { + sv_setpv(ERRSV, "Unable to fetch pointer 'newSVi64' C function from Math::Int64"); + SvSETMAGIC(ERRSV); + return 0; + } + math_int64_c_api_newSVi64 = INT2PTR(void *, SvIV(*svp)); + svp = hv_fetch(math_int64_c_api_hash, "newSVu64", 8, 0); + if (!svp || !*svp) { + sv_setpv(ERRSV, "Unable to fetch pointer 'newSVu64' C function from Math::Int64"); + SvSETMAGIC(ERRSV); + return 0; + } + math_int64_c_api_newSVu64 = INT2PTR(void *, SvIV(*svp)); + svp = hv_fetch(math_int64_c_api_hash, "randU64", 7, 0); + if (!svp || !*svp) { + sv_setpv(ERRSV, "Unable to fetch pointer 'randU64' C function from Math::Int64"); + SvSETMAGIC(ERRSV); + return 0; + } + math_int64_c_api_randU64 = INT2PTR(void *, SvIV(*svp)); + + return 1; +} |