From 02fea7ed2358518441637a1fbe5113bc4f92dd9d Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 5 Aug 2001 14:48:17 +0000 Subject: [PATCH] (gmp_init) Added extra (optional) argument to gmp_init(): a base argument which indicates the number base. E.g.: gmp_init('1010101010',2); // feed gmp a binary value. Patch by Troels. @- Added optional extra argument to gmp_init(). The extra argument @ indicates which number base gmp should use when converting a @ string to the gmp-number. (Troels) --- ext/gmp/gmp.c | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c index 5fa7ce42dd..01a94c518e 100644 --- a/ext/gmp/gmp.c +++ b/ext/gmp/gmp.c @@ -178,7 +178,7 @@ ZEND_MINFO_FUNCTION(gmp) if(Z_TYPE_PP(zval) == IS_RESOURCE) { \ ZEND_FETCH_RESOURCE(gmpnumber, mpz_t *, zval, -1, GMP_RESOURCE_NAME, le_gmp);\ } else {\ - if(convert_to_gmp(&gmpnumber,zval) == FAILURE) {\ + if(convert_to_gmp(&gmpnumber,zval,0) == FAILURE) {\ RETURN_FALSE;\ }\ ZEND_REGISTER_RESOURCE(NULL, gmpnumber, le_gmp);\ @@ -190,7 +190,7 @@ if(Z_TYPE_PP(zval) == IS_RESOURCE) { \ /* {{{ convert_to_gmp * Convert zval to be gmp number */ -static int convert_to_gmp(mpz_t * *gmpnumber, zval **val) +static int convert_to_gmp(mpz_t * *gmpnumber, zval **val, int base) { int ret = 0; @@ -207,11 +207,14 @@ static int convert_to_gmp(mpz_t * *gmpnumber, zval **val) case IS_STRING: { char *numstr = Z_STRVAL_PP(val); - if(numstr[0] == '0' && (numstr[1] == 'x' || numstr[1] == 'X')) { - ret = mpz_init_set_str(**gmpnumber, numstr+2, 16); - } else { - ret = mpz_init_set_str(**gmpnumber, numstr, 10); + if (base==0) { + if(numstr[0] == '0' && (numstr[1] == 'x' || numstr[1] == 'X')) { + base=16; + } else { + base=10; + } } + ret = mpz_init_set_str(**gmpnumber, numstr, base); } break; default: @@ -434,22 +437,30 @@ static inline void _gmp_binary_opl(INTERNAL_FUNCTION_PARAMETERS, gmp_binary_opl_ } /* }}} */ -/* Remove the following function when you have succesfully modified config.m4 - so that your module can be compiled into PHP, it exists only for testing - purposes. */ - -/* {{{ proto resource gmp_init(mixed number) +/* {{{ proto resource gmp_init(mixed number [, int base]) Initializes GMP number */ ZEND_FUNCTION(gmp_init) { - zval **number_arg; + zval **number_arg, **base_arg; mpz_t * gmpnumber; + int argc; + int base=0; - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &number_arg) == FAILURE){ + argc = ZEND_NUM_ARGS(); + if (argc < 1 || argc > 2 || zend_get_parameters_ex(argc, &number_arg, &base_arg) == FAILURE){ WRONG_PARAM_COUNT; } - if(convert_to_gmp(&gmpnumber,number_arg) == FAILURE) { + if (argc==2) { + convert_to_long_ex(base_arg); + base = Z_LVAL_PP(base_arg); + if(base < 2 || base > 36) { + zend_error(E_WARNING, "Bad base for conversion: %d (should be between 2 and 36)", base); + RETURN_FALSE; + } + } + + if(convert_to_gmp(&gmpnumber,number_arg,base) == FAILURE) { RETURN_FALSE; } @@ -516,6 +527,7 @@ ZEND_FUNCTION(gmp_strval) num_len++; } mpz_get_str(out_string, base, *gmpnum); + out_string[num_len] = '\0'; RETVAL_STRINGL(out_string, num_len, 0); } -- 2.50.1