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

Reply via email to