#ifdef __MINGW32__ #ifndef __USE_MINGW_ANSI_STDIO #define __USE_MINGW_ANSI_STDIO 1 #endif #endif #define PERL_NO_GET_CONTEXT 1 #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include #include #include "../math_mpc_unused.h" /********************* If the mpc library is not at version 1.3.0 or higher, then we allow this XS file to compile, by specifying the following compltely bogus typedef - even though every function will croak() if called. TODO: Handle less insanely. *********************/ #if MPC_VERSION < 66304 typedef int mpcr_ptr; #endif SV * Rmpcr_init(pTHX) { #if MPC_VERSION >= 66304 mpcr_t * mpcr_t_obj; SV * obj_ref, * obj; New(1, mpcr_t_obj, 1, mpcr_t); if(mpcr_t_obj == NULL) croak("Failed to allocate memory in Rmpcr_init function"); obj_ref = newSV(0); obj = newSVrv(obj_ref, "Math::MPC::Radius"); mpcr_set_zero(*mpcr_t_obj); sv_setiv(obj, INT2PTR(IV,mpcr_t_obj)); SvREADONLY_on(obj); return obj_ref; #else croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } SV * Rmpcr_init_nobless(pTHX) { #if MPC_VERSION >= 66304 mpcr_t * mpcr_t_obj; SV * obj_ref, * obj; New(1, mpcr_t_obj, 1, mpcr_t); if(mpcr_t_obj == NULL) croak("Failed to allocate memory in Rmpcr_init_nobless function"); obj_ref = newSV(0); obj = newSVrv(obj_ref, NULL); mpcr_set_zero(*mpcr_t_obj); sv_setiv(obj, INT2PTR(IV,mpcr_t_obj)); SvREADONLY_on(obj); return obj_ref; #else croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_set_str_2str(mpcr_ptr rop, char * mantissa, char* exponent) { #if MPC_VERSION >= 66304 int64_t m, e; char c; int scanned = sscanf(mantissa, "%" SCNd64 "%c", &m, &c); if(scanned < 1) croak("Scan of first input (%s) to Rmpc_set_str failed", mantissa); if(scanned > 1) warn("Extra data found in scan of first input (%s) to Rmpc_set_str", mantissa); scanned = sscanf(exponent, "%" SCNd64 "%c", &e, &c); if(scanned < 1) croak("Scan of second input (%s) to Rmpc_set_str failed", exponent); if(scanned > 1) warn("Extra data found in scan of second input (%s) to Rmpc_set_str", exponent); mpcr_set_ui64_2si64(rop, m, e); #else PERL_UNUSED_ARG3(rop, mantissa, exponent); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_clear(mpcr_ptr op) { #if MPC_VERSION >= 66304 # ifdef MATH_MPC_DEBUG printf("Rmpcr_clear()ing mpcr_ptr\n"); # endif Safefree(op); #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void DESTROY(mpcr_ptr op) { #if MPC_VERSION >= 66304 # ifdef MATH_MPC_DEBUG printf("DESTROYing mpcr_ptr\n"); # endif Safefree(op); #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } int Rmpcr_inf_p(mpcr_ptr op) { #if MPC_VERSION >= 66304 return mpcr_inf_p(op); #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } int Rmpcr_zero_p(mpcr_ptr op) { #if MPC_VERSION >= 66304 return mpcr_zero_p(op); #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } int Rmpcr_lt_half_p(mpcr_ptr op) { #if MPC_VERSION >= 66304 return mpcr_lt_half_p(op); #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } int Rmpcr_cmp(mpcr_ptr op1, mpcr_ptr op2) { #if MPC_VERSION >= 66304 return mpcr_cmp(op1, op2); #else PERL_UNUSED_ARG2(op1, op2); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_set_inf(mpcr_ptr op) { #if MPC_VERSION >= 66304 mpcr_set_inf(op); #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_set_zero(mpcr_ptr op) { #if MPC_VERSION >= 66304 mpcr_set_zero(op); #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_set_one(mpcr_ptr op) { #if MPC_VERSION >= 66304 mpcr_set_one(op); #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_set(mpcr_ptr rop, mpcr_ptr op) { #if MPC_VERSION >= 66304 mpcr_set(rop, op); #else PERL_UNUSED_ARG2(op, rop); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_set_ui64_2si64(pTHX_ mpcr_ptr rop, UV mantissa, IV exponent) { #if MPC_VERSION >= 66304 mpcr_set_ui64_2si64(rop,mantissa, exponent); #else PERL_UNUSED_ARG3(rop, mantissa, exponent); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_max (mpcr_ptr rop, mpcr_ptr op1, mpcr_ptr op2) { #if MPC_VERSION >= 66304 mpcr_max(rop, op1, op2); #else PERL_UNUSED_ARG3(rop, op1, op2); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } IV Rmpcr_get_exp (mpcr_ptr op) { #if MPC_VERSION >= 66304 int64_t ret; ret = mpcr_get_exp(op); # if IVSIZE < 8 if(ret > IV_MAX || ret < IV_MIN) { warn("return value of Rmpcr_get_exp function overflows IV\n"); croak("Use Rmpcr_get_exp_mpfr function instead"); } # endif return (IV)ret; #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } SV * Rmpcr_get_exp_mpfr (pTHX_ mpcr_ptr op) { #if MPC_VERSION >= 66304 mpfr_t * mpfr_t_obj; SV * obj_ref, * obj; int64_t exponent; New(1, mpfr_t_obj, 1, mpfr_t); if(mpfr_t_obj == NULL) croak("Failed to allocate memory in Rmpcr_get_exp_mpfr function"); obj_ref = newSV(0); obj = newSVrv(obj_ref, "Math::MPFR"); exponent = mpcr_get_exp(op); mpfr_init2 (*mpfr_t_obj, 64); mpfr_set_sj(*mpfr_t_obj, exponent, 0); /* MPFR_RNDN */ sv_setiv(obj, INT2PTR(IV,mpfr_t_obj)); SvREADONLY_on(obj); return obj_ref; #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_out_str (pTHX_ FILE *stream, mpcr_ptr op) { #if MPC_VERSION >= 66304 mpcr_out_str(stream, op); fflush(stream); #else PERL_UNUSED_ARG2(stream, op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_out_str_win (pTHX_ FILE *stream, mpcr_ptr op) { #if MPC_VERSION >= 66304 # ifdef _WIN32 int cp = GetConsoleOutputCP(); SetConsoleOutputCP(65001); mpcr_out_str(stream, op); fflush(stream); SetConsoleOutputCP(cp); # else PERL_UNUSED_ARG2(stream, op); croak("Rmpcr_out_str_win is for MS Windows only"); # endif #else PERL_UNUSED_ARG2(stream, op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_print (pTHX_ mpcr_ptr op) { #if MPC_VERSION >= 66304 mpcr_out_str(stdout, op); fflush(stdout); #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_print_win (pTHX_ mpcr_ptr op) { #if MPC_VERSION >= 66304 # ifdef _WIN32 int cp = GetConsoleOutputCP(); SetConsoleOutputCP(65001); mpcr_out_str(stdout, op); fflush(stdout); SetConsoleOutputCP(cp); # else PERL_UNUSED_ARG(op); croak("Rmpcr_print_win is for MS Windows only"); # endif #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_say (pTHX_ mpcr_ptr op) { #if MPC_VERSION >= 66304 mpcr_out_str(stdout, op); printf("\n"); fflush(stdout); #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_say_win (pTHX_ mpcr_ptr op) { #if MPC_VERSION >= 66304 # ifdef _WIN32 int cp = GetConsoleOutputCP(); SetConsoleOutputCP(65001); mpcr_out_str(stdout, op); printf("\n"); fflush(stdout); SetConsoleOutputCP(cp); # else PERL_UNUSED_ARG(op); croak("Rmpcr_say_win is for MS Windows only"); # endif #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_add (mpcr_ptr rop, mpcr_ptr op1, mpcr_ptr op2) { #if MPC_VERSION >= 66304 mpcr_add(rop, op1, op2); #else PERL_UNUSED_ARG3(rop, op1, op2); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_sub (mpcr_ptr rop, mpcr_ptr op1, mpcr_ptr op2) { #if MPC_VERSION >= 66304 mpcr_sub(rop, op1, op2); #else croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_mul (mpcr_ptr rop, mpcr_ptr op1, mpcr_ptr op2) { #if MPC_VERSION >= 66304 mpcr_mul(rop, op1, op2); #else PERL_UNUSED_ARG3(rop, op1, op2); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_div (mpcr_ptr rop, mpcr_ptr op1, mpcr_ptr op2) { #if MPC_VERSION >= 66304 mpcr_div(rop, op1, op2); #else PERL_UNUSED_ARG3(rop, op1, op2); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_mul_2ui (mpcr_ptr rop, mpcr_ptr op, unsigned long ui) { #if MPC_VERSION >= 66304 mpcr_mul_2ui(rop, op, ui); #else PERL_UNUSED_ARG3(rop, op, ui); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_div_2ui (mpcr_ptr rop, mpcr_ptr op, unsigned long ui) { #if MPC_VERSION >= 66304 mpcr_div_2ui(rop, op, ui); #else PERL_UNUSED_ARG3(rop, op, ui); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_sqr (mpcr_ptr rop, mpcr_ptr op) { #if MPC_VERSION >= 66304 mpcr_sqr(rop, op); #else croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_sqrt (mpcr_ptr rop, mpcr_ptr op) { #if MPC_VERSION >= 66304 mpcr_sqrt(rop, op); #else PERL_UNUSED_ARG2(rop, op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_sub_rnd (pTHX_ mpcr_ptr rop, mpcr_ptr op1, mpcr_ptr op2, SV * round) { #if MPC_VERSION >= 66304 mpcr_sub_rnd(rop, op1, op2, (mpfr_rnd_t)SvUV(round)); #else PERL_UNUSED_ARG4(rop, op1, op2, round); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_c_abs_rnd (pTHX_ mpcr_ptr rop, mpc_ptr mpc_op, SV * round) { /* mpc_ptr arg */ #if MPC_VERSION >= 66304 mpcr_c_abs_rnd(rop, mpc_op, (mpfr_rnd_t)SvUV(round)); #else PERL_UNUSED_ARG3(rop, mpc_op, round); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_add_rounding_error (pTHX_ mpcr_ptr rop, SV * op, SV * round) { #if MPC_VERSION >= 66304 mpcr_add_rounding_error(rop, (mpfr_prec_t)SvUV(op), (mpfr_rnd_t)SvUV(round)); #else PERL_UNUSED_ARG3(rop, op, round); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } void Rmpcr_split(pTHX_ mpcr_ptr op) { #if MPC_VERSION >= 66304 dXSARGS; PERL_UNUSED_ARG(items); if(mpcr_zero_p(op)) { ST(0) = sv_2mortal(newSVuv(0)); XSRETURN(1); } if(mpcr_inf_p(op)) { ST(0) = sv_2mortal(newSVpv("Inf", 0)); XSRETURN(1); } # if IVSIZE < 8 if(op->mant > UV_MAX) { warn("mantissa overflows UV in Rmpcr_split function\n"); croak("Use Rmpcr_split_mpfr function instead"); } if(op->exp > IV_MAX || op->exp < IV_MIN) { warn("exponent overflows IV in Rmpcr_split function\n"); croak("Use Rmpcr_split_mpfr function instead"); } # endif ST(0) = sv_2mortal(newSVuv(op->mant)); ST(1) = sv_2mortal(newSViv(op->exp)); XSRETURN(2); #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } SV * _get_radius_mantissa(pTHX_ mpcr_ptr op) { #if MPC_VERSION >= 66304 mpfr_t * mpfr_t_obj; SV * obj_ref, * obj; /* For use of Rmpcr_split_mpfr. Check that op is neither Inf nor 0 */ if(mpcr_zero_p(op) || mpcr_inf_p(op)) croak("_get_radius_mantissa function does not handle Inf or 0"); New(1, mpfr_t_obj, 1, mpfr_t); if(mpfr_t_obj == NULL) croak("Failed to allocate memory in Rmpcr_split_mpfr function"); obj_ref = newSV(0); obj = newSVrv(obj_ref, "Math::MPFR"); mpfr_init2 (*mpfr_t_obj, 64); mpfr_set_uj(*mpfr_t_obj, op->mant, 0); /* MPFR_RNDN */ sv_setiv(obj, INT2PTR(IV,mpfr_t_obj)); SvREADONLY_on(obj); return obj_ref; #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } SV * _get_radius_exponent(pTHX_ mpcr_ptr op) { #if MPC_VERSION >= 66304 mpfr_t * mpfr_t_obj; SV * obj_ref, * obj; /* For use of Rmpcr_split_mpfr. Check that op is neither Inf nor 0 */ if(mpcr_zero_p(op) || mpcr_inf_p(op)) croak("_get_radius_exponent function does not handle Inf or 0"); New(1, mpfr_t_obj, 1, mpfr_t); if(mpfr_t_obj == NULL) croak("Failed to allocate memory in Rmpcr_split_mpfr function"); obj_ref = newSV(0); obj = newSVrv(obj_ref, "Math::MPFR"); mpfr_init2 (*mpfr_t_obj, 64); mpfr_set_sj(*mpfr_t_obj, op->exp, 0); /* MPFR_RNDN */ sv_setiv(obj, INT2PTR(IV,mpfr_t_obj)); SvREADONLY_on(obj); return obj_ref; #else PERL_UNUSED_ARG(op); croak("Rmpcr_* functions need mpc-1.3.0. This is only mpc-%s", MPC_VERSION_STRING); #endif } MODULE = Math::MPC::Radius PACKAGE = Math::MPC::Radius PROTOTYPES: DISABLE SV * Rmpcr_init () CODE: RETVAL = Rmpcr_init (aTHX); OUTPUT: RETVAL SV * Rmpcr_init_nobless () CODE: RETVAL = Rmpcr_init_nobless (aTHX); OUTPUT: RETVAL void Rmpcr_set_str_2str (rop, mantissa, exponent) mpcr_ptr rop char * mantissa char * exponent CODE: Rmpcr_set_str_2str(rop, mantissa, exponent); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_clear (op) mpcr_ptr op CODE: Rmpcr_clear(op); XSRETURN_EMPTY; /* return empty stack */ void DESTROY (op) mpcr_ptr op CODE: DESTROY(op); XSRETURN_EMPTY; /* return empty stack */ int Rmpcr_inf_p (op) mpcr_ptr op int Rmpcr_zero_p (op) mpcr_ptr op int Rmpcr_lt_half_p (op) mpcr_ptr op int Rmpcr_cmp (op1, op2) mpcr_ptr op1 mpcr_ptr op2 void Rmpcr_set_inf (op) mpcr_ptr op CODE: Rmpcr_set_inf(op); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_set_zero (op) mpcr_ptr op CODE: Rmpcr_set_zero(op); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_set_one (op) mpcr_ptr op CODE: Rmpcr_set_one(op); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_set (rop, op) mpcr_ptr rop mpcr_ptr op CODE: Rmpcr_set(rop, op); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_set_ui64_2si64 (rop, mantissa, exponent) mpcr_ptr rop UV mantissa IV exponent CODE: Rmpcr_set_ui64_2si64(aTHX_ rop, mantissa, exponent); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_max (rop, op1, op2) mpcr_ptr rop mpcr_ptr op1 mpcr_ptr op2 CODE: Rmpcr_max(rop, op1, op2); XSRETURN_EMPTY; /* return empty stack */ IV Rmpcr_get_exp (op) mpcr_ptr op SV * Rmpcr_get_exp_mpfr (op) mpcr_ptr op CODE: RETVAL = Rmpcr_get_exp_mpfr (aTHX_ op); OUTPUT: RETVAL void Rmpcr_out_str (stream, op) FILE * stream mpcr_ptr op CODE: Rmpcr_out_str(aTHX_ stream, op); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_out_str_win (stream, op) FILE * stream mpcr_ptr op CODE: Rmpcr_out_str_win(aTHX_ stream, op); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_print (op) mpcr_ptr op CODE: Rmpcr_print(aTHX_ op); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_print_win (op) mpcr_ptr op CODE: Rmpcr_print_win(aTHX_ op); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_say (op) mpcr_ptr op CODE: Rmpcr_say(aTHX_ op); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_say_win (op) mpcr_ptr op CODE: Rmpcr_say_win(aTHX_ op); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_add (rop, op1, op2) mpcr_ptr rop mpcr_ptr op1 mpcr_ptr op2 CODE: Rmpcr_add(rop, op1, op2); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_sub (rop, op1, op2) mpcr_ptr rop mpcr_ptr op1 mpcr_ptr op2 CODE: Rmpcr_sub(rop, op1, op2); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_mul (rop, op1, op2) mpcr_ptr rop mpcr_ptr op1 mpcr_ptr op2 CODE: Rmpcr_mul(rop, op1, op2); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_div (rop, op1, op2) mpcr_ptr rop mpcr_ptr op1 mpcr_ptr op2 CODE: Rmpcr_div(rop, op1, op2); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_mul_2ui (rop, op, ui) mpcr_ptr rop mpcr_ptr op unsigned long ui CODE: Rmpcr_mul_2ui(rop, op, ui); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_div_2ui (rop, op, ui) mpcr_ptr rop mpcr_ptr op unsigned long ui CODE: Rmpcr_div_2ui(rop, op, ui); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_sqr (rop, op) mpcr_ptr rop mpcr_ptr op CODE: Rmpcr_sqr(rop, op); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_sqrt (rop, op) mpcr_ptr rop mpcr_ptr op CODE: Rmpcr_sqrt(rop, op); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_sub_rnd (rop, op1, op2, round) mpcr_ptr rop mpcr_ptr op1 mpcr_ptr op2 SV * round CODE: Rmpcr_sub_rnd(aTHX_ rop, op1, op2, round); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_c_abs_rnd (rop, mpc_op, round) mpcr_ptr rop mpc_ptr mpc_op SV * round CODE: Rmpcr_c_abs_rnd(aTHX_ rop, mpc_op, round); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_add_rounding_error (rop, op, round) mpcr_ptr rop SV * op SV * round CODE: Rmpcr_add_rounding_error(aTHX_ rop, op, round); XSRETURN_EMPTY; /* return empty stack */ void Rmpcr_split (op) mpcr_ptr op CODE: PL_markstack_ptr++; Rmpcr_split(aTHX_ op); return; /* assume stack size is correct */ SV * _get_radius_mantissa (op) mpcr_ptr op CODE: RETVAL = _get_radius_mantissa (aTHX_ op); OUTPUT: RETVAL SV * _get_radius_exponent (op) mpcr_ptr op CODE: RETVAL = _get_radius_exponent (aTHX_ op); OUTPUT: RETVAL