]> granicus.if.org Git - php/commitdiff
Implement feature request #50283 (allow base in gmp_strval to use full range: 2 to...
authorDavid Soria Parra <dsp@php.net>
Tue, 24 Nov 2009 13:33:35 +0000 (13:33 +0000)
committerDavid Soria Parra <dsp@php.net>
Tue, 24 Nov 2009 13:33:35 +0000 (13:33 +0000)
ext/gmp/gmp.c
ext/gmp/tests/bug50283.phpt [new file with mode: 0644]

index d2099a144615bbad04d921f4953fac98f10e912e..ebfe39ae2f0a70bee67b3f506ed5df03843d9c98 100644 (file)
@@ -804,14 +804,14 @@ ZEND_FUNCTION(gmp_strval)
                return;
        }
 
-       if (base < 2 || base > 36) {
+       if ((base < 2 && base > -2) || base > 36 || base < -36) {
                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);
+       num_len = mpz_sizeinbase(*gmpnum, abs(base));
        out_string = emalloc(num_len+2);
        if (mpz_sgn(*gmpnum) < 0) {
                num_len++;
diff --git a/ext/gmp/tests/bug50283.phpt b/ext/gmp/tests/bug50283.phpt
new file mode 100644 (file)
index 0000000..4842c00
--- /dev/null
@@ -0,0 +1,29 @@
+--TEST--
+Feature Request #50283 (allow base in gmp_strval to use full range: 2 to 62, and -2 to -36)
+--SKIPIF--
+<?php if (!extension_loaded("gmp")) print "skip"; ?>
+--FILE--
+<?php
+$a = gmp_init("0x41682179fbf5");
+printf("Decimal: %s, 36-based: %s\n", gmp_strval($a), gmp_strval($a,-36));
+printf("Decimal: %s, 36-based: %s\n", gmp_strval($a), gmp_strval($a,36));
+printf("Decimal: %s, 36-based: %s\n", gmp_strval($a), gmp_strval($a,-1));
+printf("Decimal: %s, 36-based: %s\n", gmp_strval($a), gmp_strval($a,1));
+printf("Decimal: %s, 36-based: %s\n", gmp_strval($a), gmp_strval($a,-37));
+printf("Decimal: %s, 36-based: %s\n", gmp_strval($a), gmp_strval($a,37));
+?>
+--EXPECTF--
+Decimal: 71915494046709, 36-based: PHPISCOOL
+Decimal: 71915494046709, 36-based: phpiscool
+
+Warning: gmp_strval(): Bad base for conversion: -1 in %s on line 5
+Decimal: 71915494046709, 36-based: 
+
+Warning: gmp_strval(): Bad base for conversion: 1 in %s on line 6
+Decimal: 71915494046709, 36-based: 
+
+Warning: gmp_strval(): Bad base for conversion: -37 in %s on line 7
+Decimal: 71915494046709, 36-based: 
+
+Warning: gmp_strval(): Bad base for conversion: 37 in %s on line 8
+Decimal: 71915494046709, 36-based: