tony2001                Mon Apr 23 14:57:37 2007 UTC

  Added files:                 
    /php-src/ext/gmp/tests      039.phpt 

  Modified files:              
    /php-src    NEWS 
    /php-src/ext/gmp    gmp.c php_gmp.h 
  Log:
  [DOC] add gmp_testbit() function
  tests if the specified bit is set and returns false/true
  
  
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2145&r2=1.2146&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2145 php-src/NEWS:1.2146
--- php-src/NEWS:1.2145 Wed Apr 18 19:39:12 2007
+++ php-src/NEWS        Mon Apr 23 14:57:37 2007
@@ -57,6 +57,7 @@
     set params during context creation. (Sara)
   . "context" and "binary_pipes" params in "other_options" arg. (Sara)
   . stream_resolve_include_path(). (Sara)
+- Added gmp_testbit() function. (Tony)
 - Added shm_has_var() function. (Mike)
 - Added str_getcsv() function. (Sara)
 - Added ext/hash support to ext/session's ID generator. (Sara)
http://cvs.php.net/viewvc.cgi/php-src/ext/gmp/gmp.c?r1=1.62&r2=1.63&diff_format=u
Index: php-src/ext/gmp/gmp.c
diff -u php-src/ext/gmp/gmp.c:1.62 php-src/ext/gmp/gmp.c:1.63
--- php-src/ext/gmp/gmp.c:1.62  Thu Apr 19 09:36:34 2007
+++ php-src/ext/gmp/gmp.c       Mon Apr 23 14:57:37 2007
@@ -242,6 +242,12 @@
        ZEND_ARG_INFO(0, index)
 ZEND_END_ARG_INFO()
 
+       static
+ZEND_BEGIN_ARG_INFO(arginfo_gmp_testbit, 0)
+       ZEND_ARG_INFO(0, a)
+       ZEND_ARG_INFO(0, index)
+ZEND_END_ARG_INFO()
+
 static
 ZEND_BEGIN_ARG_INFO(arginfo_gmp_popcount, 0)
        ZEND_ARG_INFO(0, a)
@@ -308,6 +314,7 @@
        ZEND_FE(gmp_xor,        arginfo_gmp_xor)
        ZEND_FE(gmp_setbit,     arginfo_gmp_setbit)
        ZEND_FE(gmp_clrbit,     arginfo_gmp_clrbit)
+       ZEND_FE(gmp_testbit,    arginfo_gmp_testbit)
        ZEND_FE(gmp_scan0, arginfo_gmp_scan0)
        ZEND_FE(gmp_scan1, arginfo_gmp_scan1)
        ZEND_FE(gmp_popcount, arginfo_gmp_popcount)
@@ -1531,6 +1538,35 @@
 }
 /* }}} */
 
+/* {{{ proto bool gmp_testbit(resource a, int index) U
+   Tests if bit is set in a */
+ZEND_FUNCTION(gmp_testbit)
+{
+       zval **a_arg, **ind_arg;
+       int index;
+       mpz_t *gmpnum_a;
+
+       if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &a_arg, &ind_arg) 
== FAILURE){
+               WRONG_PARAM_COUNT;
+       }
+
+       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_FALSE;
+       }
+
+       if (mpz_tstbit(*gmpnum_a, index)) {
+               RETURN_TRUE;
+       }
+       RETURN_FALSE;
+}
+/* }}} */
+
 /* {{{ proto int gmp_popcount(resource a) U
    Calculates the population count of a */
 ZEND_FUNCTION(gmp_popcount)
http://cvs.php.net/viewvc.cgi/php-src/ext/gmp/php_gmp.h?r1=1.16&r2=1.17&diff_format=u
Index: php-src/ext/gmp/php_gmp.h
diff -u php-src/ext/gmp/php_gmp.h:1.16 php-src/ext/gmp/php_gmp.h:1.17
--- php-src/ext/gmp/php_gmp.h:1.16      Fri Jan 12 12:31:31 2007
+++ php-src/ext/gmp/php_gmp.h   Mon Apr 23 14:57:37 2007
@@ -70,6 +70,7 @@
 ZEND_FUNCTION(gmp_random);
 ZEND_FUNCTION(gmp_setbit);
 ZEND_FUNCTION(gmp_clrbit);
+ZEND_FUNCTION(gmp_testbit);
 ZEND_FUNCTION(gmp_scan0);
 ZEND_FUNCTION(gmp_scan1);
 ZEND_FUNCTION(gmp_popcount);

http://cvs.php.net/viewvc.cgi/php-src/ext/gmp/tests/039.phpt?view=markup&rev=1.1
Index: php-src/ext/gmp/tests/039.phpt
+++ php-src/ext/gmp/tests/039.phpt
--TEST--
gmp_testbit() basic tests
--FILE--
<?php

$n = gmp_init(0);
var_dump(gmp_testbit($n, -10));
var_dump(gmp_testbit($n, 0));
var_dump(gmp_testbit($n, 1));
var_dump(gmp_testbit($n, 100));

$n = gmp_init(-1);
var_dump(gmp_testbit($n, 1));
var_dump(gmp_testbit($n, -1));

$n = gmp_init("1000000");
var_dump(gmp_testbit($n, 1));
gmp_setbit($n, 1);
var_dump(gmp_testbit($n, 1));
var_dump(gmp_strval($n));

gmp_setbit($n, 5);
var_dump(gmp_testbit($n, 5));
var_dump(gmp_strval($n));

$n = gmp_init("238462734628347239571823641234");
var_dump(gmp_testbit($n, 5));
gmp_setbit($n, 5);
var_dump(gmp_testbit($n, 5));
var_dump(gmp_strval($n));

gmp_clrbit($n, 5);
var_dump(gmp_testbit($n, 5));
var_dump(gmp_strval($n));

echo "Done\n";
?>
--EXPECTF--     
Warning: gmp_testbit(): Index must be greater than or equal to zero in %s on 
line %d
bool(false)
bool(false)
bool(false)
bool(false)
bool(true)

Warning: gmp_testbit(): Index must be greater than or equal to zero in %s on 
line %d
bool(false)
bool(false)
bool(true)
string(7) "1000002"
bool(true)
string(7) "1000034"
bool(false)
bool(true)
string(30) "238462734628347239571823641266"
bool(false)
string(30) "238462734628347239571823641234"
Done
--UEXPECTF--
Warning: gmp_testbit(): Index must be greater than or equal to zero in %s on 
line %d
bool(false)
bool(false)
bool(false)
bool(false)
bool(true)

Warning: gmp_testbit(): Index must be greater than or equal to zero in %s on 
line %d
bool(false)
bool(false)
bool(true)
unicode(7) "1000002"
bool(true)
unicode(7) "1000034"
bool(false)
bool(true)
unicode(30) "238462734628347239571823641266"
bool(false)
unicode(30) "238462734628347239571823641234"
Done

Reply via email to