mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
(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)
This commit is contained in:
parent
c7d7834a43
commit
02fea7ed23
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user