stas Thu Nov 1 20:33:23 2007 UTC
Modified files:
/php-src/ext/gmp gmp.c
Log:
MFB gmp fixes
http://cvs.php.net/viewvc.cgi/php-src/ext/gmp/gmp.c?r1=1.65&r2=1.66&diff_format=u
Index: php-src/ext/gmp/gmp.c
diff -u php-src/ext/gmp/gmp.c:1.65 php-src/ext/gmp/gmp.c:1.66
--- php-src/ext/gmp/gmp.c:1.65 Thu Sep 27 18:28:39 2007
+++ php-src/ext/gmp/gmp.c Thu Nov 1 20:33:22 2007
@@ -430,16 +430,23 @@
/* Fetch zval to be GMP number.
Initially, zval can be also number or string */
-#define FETCH_GMP_ZVAL(gmpnumber, zval) \
-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, 0 TSRMLS_CC) == FAILURE) {\
- RETURN_FALSE;\
- }\
- ZEND_REGISTER_RESOURCE(NULL, gmpnumber, le_gmp);\
+#define FETCH_GMP_ZVAL(gmpnumber, zval, tmp_resource)
\
+if (Z_TYPE_PP(zval) == IS_RESOURCE) {
\
+ ZEND_FETCH_RESOURCE(gmpnumber, mpz_t *, zval, -1, GMP_RESOURCE_NAME,
le_gmp); \
+ tmp_resource = 0;
\
+} else {
\
+ if (convert_to_gmp(&gmpnumber, zval, 0 TSRMLS_CC) == FAILURE) {
\
+ RETURN_FALSE;
\
+ }
\
+ tmp_resource = ZEND_REGISTER_RESOURCE(NULL, gmpnumber, le_gmp);
\
}
+#define FREE_GMP_TEMP(tmp_resource) \
+ if(tmp_resource) { \
+ zend_list_delete(tmp_resource); \
+ }
+
+
/* create a new initialized GMP number */
#define INIT_GMP_NUM(gmpnumber) { gmpnumber=emalloc(sizeof(mpz_t));
mpz_init(*gmpnumber); }
#define FREE_GMP_NUM(gmpnumber) { mpz_clear(*gmpnumber); efree(gmpnumber); }
@@ -539,13 +546,14 @@
mpz_t *gmpnum_a, *gmpnum_b, *gmpnum_result;
unsigned long long_result = 0;
int use_ui = 0;
+ int arga_tmp = 0, argb_tmp = 0;
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, arga_tmp);
if (gmp_ui_op && Z_TYPE_PP(b_arg) == IS_LONG && Z_LVAL_PP(b_arg) >= 0) {
use_ui = 1;
} else {
- FETCH_GMP_ZVAL(gmpnum_b, b_arg);
+ FETCH_GMP_ZVAL(gmpnum_b, b_arg, argb_tmp);
}
if(check_b_zero) {
@@ -558,6 +566,8 @@
if(b_is_zero) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Zero
operand not allowed");
+ FREE_GMP_TEMP(arga_tmp);
+ FREE_GMP_TEMP(argb_tmp);
RETURN_FALSE;
}
}
@@ -574,6 +584,9 @@
gmp_op(*gmpnum_result, *gmpnum_a, *gmpnum_b);
}
+ FREE_GMP_TEMP(arga_tmp);
+ FREE_GMP_TEMP(argb_tmp);
+
if (use_ui && allow_ui_return) {
FREE_GMP_NUM(gmpnum_result);
RETURN_LONG((long)long_result);
@@ -593,14 +606,15 @@
zval r;
int use_ui = 0;
unsigned long long_result = 0;
+ int arga_tmp = 0, argb_tmp = 0;
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, arga_tmp);
if (gmp_ui_op && Z_TYPE_PP(b_arg) == IS_LONG && Z_LVAL_PP(b_arg) >= 0) {
/* use _ui function */
use_ui = 1;
} else {
- FETCH_GMP_ZVAL(gmpnum_b, b_arg);
+ FETCH_GMP_ZVAL(gmpnum_b, b_arg, argb_tmp);
}
if(check_b_zero) {
@@ -613,6 +627,8 @@
if(b_is_zero) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Zero
operand not allowed");
+ FREE_GMP_TEMP(arga_tmp);
+ FREE_GMP_TEMP(argb_tmp);
RETURN_FALSE;
}
}
@@ -630,6 +646,9 @@
gmp_op(*gmpnum_result1, *gmpnum_result2, *gmpnum_a, *gmpnum_b);
}
+ FREE_GMP_TEMP(arga_tmp);
+ FREE_GMP_TEMP(argb_tmp);
+
array_init(return_value);
ZEND_REGISTER_RESOURCE(&r, gmpnum_result1, le_gmp);
add_index_resource(return_value, 0, Z_LVAL(r));
@@ -649,8 +668,8 @@
{
zval **a_arg, **b_arg;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg, &b_arg)
== FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg,
&b_arg) == FAILURE){
+ return;
}
gmp_zval_binary_ui_op(return_value, a_arg, b_arg, gmp_op, gmp_ui_op);
@@ -664,12 +683,14 @@
static inline void gmp_zval_unary_op(zval *return_value, zval **a_arg,
gmp_unary_op_t gmp_op TSRMLS_DC)
{
mpz_t *gmpnum_a, *gmpnum_result;
+ int temp_a;
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
INIT_GMP_NUM(gmpnum_result);
gmp_op(*gmpnum_result, *gmpnum_a);
+ FREE_GMP_TEMP(temp_a);
ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
}
/* }}} */
@@ -696,10 +717,10 @@
{
zval **a_arg;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &a_arg) ==
FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) ==
FAILURE){
+ return;
}
-
+
gmp_zval_unary_ui_op(return_value, a_arg, gmp_op);
}
/* }}} */
@@ -710,8 +731,8 @@
{
zval **a_arg;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &a_arg) ==
FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) ==
FAILURE){
+ return;
}
gmp_zval_unary_op(return_value, a_arg, gmp_op TSRMLS_CC);
@@ -724,14 +745,15 @@
{
zval **a_arg;
mpz_t *gmpnum_a;
+ int temp_a;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &a_arg) ==
FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) ==
FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
-
- RETURN_LONG(gmp_op(*gmpnum_a));
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
+ RETVAL_LONG(gmp_op(*gmpnum_a));
+ FREE_GMP_TEMP(temp_a);
}
/* }}} */
@@ -741,15 +763,19 @@
{
zval **a_arg, **b_arg;
mpz_t *gmpnum_a, *gmpnum_b;
+ int temp_a, temp_b;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg, &b_arg)
== FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg,
&b_arg) == FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
- FETCH_GMP_ZVAL(gmpnum_b, a_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
+ FETCH_GMP_ZVAL(gmpnum_b, b_arg, temp_b);
- RETURN_LONG(gmp_op(*gmpnum_a, *gmpnum_b));
+ RETVAL_LONG(gmp_op(*gmpnum_a, *gmpnum_b));
+
+ FREE_GMP_TEMP(temp_a);
+ FREE_GMP_TEMP(temp_b);
}
/* }}} */
@@ -757,23 +783,17 @@
Initializes GMP number */
ZEND_FUNCTION(gmp_init)
{
- zval **number_arg, **base_arg;
+ zval **number_arg;
mpz_t * gmpnumber;
- int argc;
- int base=0;
+ long base=0;
- argc = ZEND_NUM_ARGS();
- if (argc < 1 || argc > 2 || zend_get_parameters_ex(argc, &number_arg,
&base_arg) == FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|l",
&number_arg, &base) == FAILURE) {
+ return;
}
- if (argc == 2) {
- convert_to_long_ex(base_arg);
- base = Z_LVAL_PP(base_arg);
- if (base < 2 || base > 36) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad base
for conversion: %d (should be between 2 and 36)", base);
- RETURN_FALSE;
- }
+ if (base && (base < 2 || base > 36)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad base for
conversion: %ld (should be between 2 and 36)", base);
+ RETURN_FALSE;
}
if (convert_to_gmp(&gmpnumber, number_arg, base TSRMLS_CC) == FAILURE) {
@@ -792,8 +812,8 @@
zval **gmpnumber_arg;
mpz_t * gmpnum;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &gmpnumber_arg)
== FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z",
&gmpnumber_arg) == FAILURE){
+ return;
}
if (Z_TYPE_PP(gmpnumber_arg) == IS_RESOURCE) {
@@ -810,40 +830,33 @@
Gets string representation of GMP number */
ZEND_FUNCTION(gmp_strval)
{
- zval **gmpnumber_arg, **base_arg;
- int base=10, num_len, argc;
+ zval **gmpnumber_arg;
+ long base=10;
+ int num_len;
mpz_t * gmpnum;
char *out_string;
+ int temp_a;
- argc = ZEND_NUM_ARGS();
- if (argc < 1 || argc > 2 || zend_get_parameters_ex(argc,
&gmpnumber_arg, &base_arg) == FAILURE){
- WRONG_PARAM_COUNT;
- }
-
- FETCH_GMP_ZVAL(gmpnum, gmpnumber_arg);
-
- switch (argc) {
- case 2:
- convert_to_long_ex(base_arg);
- base = Z_LVAL_PP(base_arg);
- break;
- case 1:
- base = 10;
- break;
+ if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "Z|l",
&gmpnumber_arg, &base ) == FAILURE ) {
+ return;
}
if (base < 2 || base > 36) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad base for
conversion: %d", base);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Bad base for
conversion: %ld", base);
RETURN_FALSE;
}
+ FETCH_GMP_ZVAL(gmpnum, gmpnumber_arg, temp_a);
+
num_len = mpz_sizeinbase(*gmpnum, base);
out_string = emalloc(num_len+2);
if (mpz_sgn(*gmpnum) < 0) {
num_len++;
}
mpz_get_str(out_string, base, *gmpnum);
-
+
+ FREE_GMP_TEMP(temp_a);
+
/*
From GMP documentation for mpz_sizeinbase():
The returned value will be exact or 1 too big. If base is a power of
@@ -889,22 +902,11 @@
Divide a by b, returns quotient and reminder */
ZEND_FUNCTION(gmp_div_qr)
{
- zval **a_arg, **b_arg, **round_arg;
- int round = GMP_ROUND_ZERO, argc;
-
- argc = ZEND_NUM_ARGS();
- if (argc < 2 || argc > 3 || zend_get_parameters_ex(argc, &a_arg,
&b_arg, &round_arg) == FAILURE){
- WRONG_PARAM_COUNT;
- }
+ zval **a_arg, **b_arg;
+ long round = GMP_ROUND_ZERO;
- switch (argc) {
- case 3:
- convert_to_long_ex(round_arg);
- round = Z_LVAL_PP(round_arg);
- break;
- case 2:
- round = GMP_ROUND_ZERO;
- break;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ|l", &a_arg,
&b_arg, &round) == FAILURE) {
+ return;
}
switch (round) {
@@ -926,22 +928,11 @@
Divide a by b, returns reminder only */
ZEND_FUNCTION(gmp_div_r)
{
- zval **a_arg, **b_arg, **round_arg;
- int round = GMP_ROUND_ZERO, argc;
-
- argc = ZEND_NUM_ARGS();
- if (argc < 2 || argc > 3 || zend_get_parameters_ex(argc, &a_arg,
&b_arg, &round_arg) == FAILURE){
- WRONG_PARAM_COUNT;
- }
+ zval **a_arg, **b_arg;
+ long round = GMP_ROUND_ZERO;
- switch (argc) {
- case 3:
- convert_to_long_ex(round_arg);
- round = Z_LVAL_PP(round_arg);
- break;
- case 2:
- round = GMP_ROUND_ZERO;
- break;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ|l", &a_arg,
&b_arg, &round) == FAILURE) {
+ return;
}
switch (round) {
@@ -962,22 +953,11 @@
Divide a by b, returns quotient only */
ZEND_FUNCTION(gmp_div_q)
{
- zval **a_arg, **b_arg, **round_arg;
- int round = GMP_ROUND_ZERO, argc;
-
- argc = ZEND_NUM_ARGS();
- if (argc < 2 || argc > 3 || zend_get_parameters_ex(argc, &a_arg,
&b_arg, &round_arg) == FAILURE){
- WRONG_PARAM_COUNT;
- }
+ zval **a_arg, **b_arg;
+ long round = GMP_ROUND_ZERO;
- switch (argc) {
- case 3:
- convert_to_long_ex(round_arg);
- round = Z_LVAL_PP(round_arg);
- break;
- case 2:
- round = GMP_ROUND_ZERO;
- break;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ|l", &a_arg,
&b_arg, &round) == FAILURE) {
+ return;
}
switch (round) {
@@ -1001,8 +981,8 @@
{
zval **a_arg, **b_arg;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg, &b_arg)
== FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg,
&b_arg) == FAILURE){
+ return;
}
gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_mod,
(gmp_binary_ui_op_t)mpz_mod_ui, 1, 1 TSRMLS_CC);
@@ -1015,8 +995,8 @@
{
zval **a_arg, **b_arg;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg, &b_arg)
== FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg,
&b_arg) == FAILURE){
+ return;
}
gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_divexact,
NULL, 0, 1 TSRMLS_CC);
@@ -1045,21 +1025,22 @@
{
zval **a_arg;
mpz_t *gmpnum_tmp;
+ int temp_a;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &a_arg) ==
FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) ==
FAILURE){
+ return;
}
if (Z_TYPE_PP(a_arg) == IS_RESOURCE) {
- FETCH_GMP_ZVAL(gmpnum_tmp, a_arg);
+ FETCH_GMP_ZVAL(gmpnum_tmp, a_arg, temp_a); /* no need to
free this since it's IS_RESOURCE */
if (mpz_sgn(*gmpnum_tmp) < 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING,"Number has
to be greater than or equal to 0");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number has
to be greater than or equal to 0");
RETURN_FALSE;
}
} else {
convert_to_long_ex(a_arg);
if (Z_LVAL_PP(a_arg) < 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING,"Number has
to be greater than or equal to 0");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number has
to be greater than or equal to 0");
RETURN_FALSE;
}
}
@@ -1072,34 +1053,34 @@
Raise base to power exp */
ZEND_FUNCTION(gmp_pow)
{
- zval **base_arg, **exp_arg;
+ zval **base_arg;
mpz_t *gmpnum_result, *gmpnum_base;
int use_ui = 0;
+ long exp;
+ int temp_base = 0;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &base_arg,
&exp_arg) == FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &base_arg,
&exp) == FAILURE){
+ return;
}
if (Z_TYPE_PP(base_arg) == IS_LONG && Z_LVAL_PP(base_arg) >= 0) {
use_ui = 1;
} else {
- FETCH_GMP_ZVAL(gmpnum_base, base_arg);
+ FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base);
}
- convert_to_long_ex(exp_arg);
-
- if (Z_LVAL_PP(exp_arg) < 0) {
+ if (exp < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Negative exponent
not supported");
RETURN_FALSE;
}
INIT_GMP_NUM(gmpnum_result);
if (use_ui) {
- mpz_ui_pow_ui(*gmpnum_result, Z_LVAL_PP(base_arg),
Z_LVAL_PP(exp_arg));
+ mpz_ui_pow_ui(*gmpnum_result, Z_LVAL_PP(base_arg), exp);
} else {
- mpz_pow_ui(*gmpnum_result, *gmpnum_base, Z_LVAL_PP(exp_arg));
+ mpz_pow_ui(*gmpnum_result, *gmpnum_base, exp);
}
-
+ FREE_GMP_TEMP(temp_base);
ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
}
/* }}} */
@@ -1111,25 +1092,29 @@
zval **base_arg, **exp_arg, **mod_arg;
mpz_t *gmpnum_base, *gmpnum_exp, *gmpnum_mod, *gmpnum_result;
int use_ui = 0;
+ int temp_base = 0, temp_exp = 0, temp_mod = 0;
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &base_arg,
&exp_arg, &mod_arg) == FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZZ", &base_arg,
&exp_arg, &mod_arg) == FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_base, base_arg);
+ FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base);
if (Z_TYPE_PP(exp_arg) == IS_LONG && Z_LVAL_PP(exp_arg) >= 0) {
use_ui = 1;
} else {
- FETCH_GMP_ZVAL(gmpnum_exp, exp_arg);
+ FETCH_GMP_ZVAL(gmpnum_exp, exp_arg, temp_exp);
if (mpz_sgn(*gmpnum_exp) < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Second
parameter cannot be less than 0");
RETURN_FALSE;
}
}
- FETCH_GMP_ZVAL(gmpnum_mod, mod_arg);
+ FETCH_GMP_ZVAL(gmpnum_mod, mod_arg, temp_mod);
if (!mpz_cmp_ui(*gmpnum_mod, 0)) {
+ FREE_GMP_TEMP(temp_base);
+ FREE_GMP_TEMP(temp_exp);
+ FREE_GMP_TEMP(temp_mod);
RETURN_FALSE;
}
@@ -1140,6 +1125,10 @@
mpz_powm(*gmpnum_result, *gmpnum_base, *gmpnum_exp,
*gmpnum_mod);
}
+ FREE_GMP_TEMP(temp_base);
+ FREE_GMP_TEMP(temp_exp);
+ FREE_GMP_TEMP(temp_mod);
+
ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
}
@@ -1151,20 +1140,23 @@
{
zval **a_arg;
mpz_t *gmpnum_a, *gmpnum_result;
+ int temp_a;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &a_arg) ==
FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) ==
FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
if (mpz_sgn(*gmpnum_a) < 0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING,"Number has to be
greater than or equal to 0");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number has to be
greater than or equal to 0");
+ FREE_GMP_TEMP(temp_a);
RETURN_FALSE;
}
INIT_GMP_NUM(gmpnum_result);
mpz_sqrt(*gmpnum_result, *gmpnum_a);
+ FREE_GMP_TEMP(temp_a);
ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
}
@@ -1177,12 +1169,13 @@
zval **a_arg;
mpz_t *gmpnum_a, *gmpnum_result1, *gmpnum_result2;
zval r;
+ int temp_a;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &a_arg) ==
FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) ==
FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
if (mpz_sgn(*gmpnum_a) < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Number has to be
greater than or equal to 0");
@@ -1193,6 +1186,7 @@
INIT_GMP_NUM(gmpnum_result2);
mpz_sqrtrem(*gmpnum_result1, *gmpnum_result2, *gmpnum_a);
+ FREE_GMP_TEMP(temp_a);
array_init(return_value);
ZEND_REGISTER_RESOURCE(&r, gmpnum_result1, le_gmp);
@@ -1208,14 +1202,16 @@
{
zval **a_arg;
mpz_t *gmpnum_a;
+ int temp_a;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &a_arg) ==
FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) ==
FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- RETURN_BOOL((mpz_perfect_square_p(*gmpnum_a)!=0));
+ RETVAL_BOOL((mpz_perfect_square_p(*gmpnum_a)!=0));
+ FREE_GMP_TEMP(temp_a);
}
/* }}} */
@@ -1223,28 +1219,19 @@
Checks if a is "probably prime" */
ZEND_FUNCTION(gmp_prob_prime)
{
- zval **gmpnumber_arg, **reps_arg;
+ zval **gmpnumber_arg;
mpz_t *gmpnum_a;
- int argc, reps = 10;
+ long reps = 10;
+ int temp_a;
- argc = ZEND_NUM_ARGS();
- if (argc < 1 || argc > 2 || zend_get_parameters_ex(argc,
&gmpnumber_arg, &reps_arg) == FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|l",
&gmpnumber_arg, &reps) == FAILURE) {
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, gmpnumber_arg);
-
- switch (argc) {
- case 2:
- convert_to_long_ex(reps_arg);
- reps = Z_LVAL_PP(reps_arg);
- break;
- case 1:
- reps = 10;
- break;
- }
+ FETCH_GMP_ZVAL(gmpnum_a, gmpnumber_arg, temp_a);
- RETURN_LONG(mpz_probab_prime_p(*gmpnum_a, reps));
+ RETVAL_LONG(mpz_probab_prime_p(*gmpnum_a, reps));
+ FREE_GMP_TEMP(temp_a);
}
/* }}} */
@@ -1254,11 +1241,11 @@
{
zval **a_arg, **b_arg;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg, &b_arg)
== FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg,
&b_arg) == FAILURE){
+ return;
}
- gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_gcd,
(gmp_binary_ui_op_t)mpz_gcd_ui, 1, 0 TSRMLS_CC);
+ gmp_zval_binary_ui_op_ex(return_value, a_arg, b_arg, mpz_gcd,
(gmp_binary_ui_op_t)mpz_gcd_ui, 0, 0 TSRMLS_CC);
}
/* }}} */
@@ -1269,19 +1256,22 @@
zval **a_arg, **b_arg;
mpz_t *gmpnum_a, *gmpnum_b, *gmpnum_t, *gmpnum_s, *gmpnum_g;
zval r;
+ int temp_a, temp_b;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg, &b_arg)
== FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg,
&b_arg) == FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
- FETCH_GMP_ZVAL(gmpnum_b, b_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
+ FETCH_GMP_ZVAL(gmpnum_b, b_arg, temp_b);
INIT_GMP_NUM(gmpnum_g);
INIT_GMP_NUM(gmpnum_s);
INIT_GMP_NUM(gmpnum_t);
mpz_gcdext(*gmpnum_g, *gmpnum_s, *gmpnum_t, *gmpnum_a, *gmpnum_b);
+ FREE_GMP_TEMP(temp_a);
+ FREE_GMP_TEMP(temp_b);
array_init(return_value);
@@ -1300,16 +1290,21 @@
{
zval **a_arg, **b_arg;
mpz_t *gmpnum_a, *gmpnum_b, *gmpnum_result;
+ int temp_a, temp_b;
+ int res;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg, &b_arg)
== FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg,
&b_arg) == FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
- FETCH_GMP_ZVAL(gmpnum_b, b_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
+ FETCH_GMP_ZVAL(gmpnum_b, b_arg, temp_b);
INIT_GMP_NUM(gmpnum_result);
- if (mpz_invert(*gmpnum_result, *gmpnum_a, *gmpnum_b)) {
+ res=mpz_invert(*gmpnum_result, *gmpnum_a, *gmpnum_b);
+ FREE_GMP_TEMP(temp_a);
+ FREE_GMP_TEMP(temp_b);
+ if (res) {
ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
} else {
FREE_GMP_NUM(gmpnum_result);
@@ -1341,17 +1336,18 @@
zval **a_arg, **b_arg;
mpz_t *gmpnum_a, *gmpnum_b;
int use_si = 0, res;
+ int temp_a, temp_b;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg, &b_arg)
== FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg,
&b_arg) == FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
if (Z_TYPE_PP(b_arg) == IS_LONG) {
use_si = 1;
} else {
- FETCH_GMP_ZVAL(gmpnum_b, b_arg);
+ FETCH_GMP_ZVAL(gmpnum_b, b_arg, temp_b);
}
if (use_si) {
@@ -1359,6 +1355,7 @@
} else {
res = mpz_cmp(*gmpnum_a, *gmpnum_b);
}
+ FREE_GMP_TEMP(temp_a);
RETURN_LONG(res);
}
@@ -1370,14 +1367,16 @@
{
zval **a_arg;
mpz_t *gmpnum_a;
+ int temp_a;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &a_arg) ==
FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) ==
FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- RETURN_LONG(mpz_sgn(*gmpnum_a));
+ RETVAL_LONG(mpz_sgn(*gmpnum_a));
+ FREE_GMP_TEMP(temp_a);
}
/* }}} */
@@ -1385,19 +1384,11 @@
Gets random number */
ZEND_FUNCTION(gmp_random)
{
- zval **limiter_arg;
- int limiter, argc;
+ long limiter = 20;
mpz_t *gmpnum_result;
- argc = ZEND_NUM_ARGS();
-
- if (argc == 0) {
- limiter = 20;
- } else if (argc == 1 && zend_get_parameters_ex(1, &limiter_arg) ==
SUCCESS) {
- convert_to_long_ex(limiter_arg);
- limiter = Z_LVAL_PP(limiter_arg);
- } else {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &limiter) ==
FAILURE) {
+ return;
}
INIT_GMP_NUM(gmpnum_result);
@@ -1456,13 +1447,14 @@
/* use formula: a^b = (a|b)&^(a&b) */
zval **a_arg, **b_arg;
mpz_t *gmpnum_a, *gmpnum_b, *gmpnum_result, *gmpnum_t;
+ int temp_a, temp_b;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg, &b_arg)
== FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg,
&b_arg) == FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
- FETCH_GMP_ZVAL(gmpnum_b, b_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
+ FETCH_GMP_ZVAL(gmpnum_b, b_arg, temp_b);
INIT_GMP_NUM(gmpnum_result);
INIT_GMP_NUM(gmpnum_t);
@@ -1475,6 +1467,8 @@
FREE_GMP_NUM(gmpnum_t);
+ FREE_GMP_TEMP(temp_a);
+ FREE_GMP_TEMP(temp_b);
ZEND_REGISTER_RESOURCE(return_value, gmpnum_result, le_gmp);
}
/* }}} */
@@ -1483,30 +1477,17 @@
Sets or clear bit in a */
ZEND_FUNCTION(gmp_setbit)
{
- zval **a_arg, **ind_arg, **set_c_arg;
- int argc, index, set = 1;
+ zval **a_arg;
+ long index;
+ zend_bool set = 1;
mpz_t *gmpnum_a;
- argc = ZEND_NUM_ARGS();
- if (argc < 2 || argc > 3 || zend_get_parameters_ex(argc, &a_arg,
&ind_arg, &set_c_arg) == FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl|b", &a_arg,
&index, &set) == FAILURE) {
+ return;
}
ZEND_FETCH_RESOURCE(gmpnum_a, mpz_t *, a_arg, -1, GMP_RESOURCE_NAME,
le_gmp);
- convert_to_long_ex(ind_arg);
- index = Z_LVAL_PP(ind_arg);
-
- switch (argc) {
- case 3:
- convert_to_long_ex(set_c_arg);
- set = Z_LVAL_PP(set_c_arg);
- break;
- case 2:
- set = 1;
- break;
- }
-
if (index < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index must be
greater than or equal to zero");
return;
@@ -1524,19 +1505,16 @@
Clears bit in a */
ZEND_FUNCTION(gmp_clrbit)
{
- zval **a_arg, **ind_arg;
- int index;
+ zval **a_arg;
+ long index;
mpz_t *gmpnum_a;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg, &ind_arg)
== FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &a_arg,
&index) == FAILURE){
+ return;
}
ZEND_FETCH_RESOURCE(gmpnum_a, mpz_t *, a_arg, -1, GMP_RESOURCE_NAME,
le_gmp);
- convert_to_long_ex(ind_arg);
- index = Z_LVAL_PP(ind_arg);
-
if (index < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Index must be
greater than or equal to zero");
return;
@@ -1581,14 +1559,16 @@
{
zval **a_arg;
mpz_t *gmpnum_a;
+ int temp_a;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &a_arg) ==
FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &a_arg) ==
FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- RETURN_LONG(mpz_popcount(*gmpnum_a));
+ RETVAL_LONG(mpz_popcount(*gmpnum_a));
+ FREE_GMP_TEMP(temp_a);
}
/* }}} */
@@ -1598,15 +1578,18 @@
{
zval **a_arg, **b_arg;
mpz_t *gmpnum_a, *gmpnum_b;
+ int temp_a, temp_b;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg, &b_arg)
== FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ZZ", &a_arg,
&b_arg) == FAILURE){
+ return;
}
-
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
- FETCH_GMP_ZVAL(gmpnum_b, b_arg);
- RETURN_LONG(mpz_hamdist(*gmpnum_a, *gmpnum_b));
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
+ FETCH_GMP_ZVAL(gmpnum_b, b_arg, temp_b);
+
+ RETVAL_LONG(mpz_hamdist(*gmpnum_a, *gmpnum_b));
+ FREE_GMP_TEMP(temp_a);
+ FREE_GMP_TEMP(temp_b);
}
/* }}} */
@@ -1614,22 +1597,24 @@
Finds first zero bit */
ZEND_FUNCTION(gmp_scan0)
{
- zval **a_arg, **start_arg;
+ zval **a_arg;
mpz_t *gmpnum_a;
+ int temp_a;
+ long start;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg,
&start_arg) == FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &a_arg,
&start) == FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
- convert_to_long_ex(start_arg);
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
- if (Z_LVAL_PP(start_arg) < 0) {
+ if (start < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Starting index
must be greater than or equal to zero");
RETURN_FALSE;
}
- RETURN_LONG(mpz_scan0(*gmpnum_a, Z_LVAL_PP(start_arg)));
+ RETVAL_LONG(mpz_scan0(*gmpnum_a, start));
+ FREE_GMP_TEMP(temp_a);
}
/* }}} */
@@ -1637,22 +1622,23 @@
Finds first non-zero bit */
ZEND_FUNCTION(gmp_scan1)
{
- zval **a_arg, **start_arg;
+ zval **a_arg;
mpz_t *gmpnum_a;
+ int temp_a;
+ long start;
- if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg,
&start_arg) == FAILURE){
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zl", &a_arg,
&start) == FAILURE){
+ return;
}
- FETCH_GMP_ZVAL(gmpnum_a, a_arg);
- convert_to_long_ex(start_arg);
-
- if (Z_LVAL_PP(start_arg) < 0) {
+ FETCH_GMP_ZVAL(gmpnum_a, a_arg, temp_a);
+ if (start < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Starting index
must be greater than or equal to zero");
RETURN_FALSE;
}
- RETURN_LONG(mpz_scan1(*gmpnum_a, Z_LVAL_PP(start_arg)));
+ RETVAL_LONG(mpz_scan1(*gmpnum_a, start));
+ FREE_GMP_TEMP(temp_a);
}
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php