summaryrefslogtreecommitdiff
path: root/ext/gmp
diff options
context:
space:
mode:
authorAntony Dovgal <tony2001@php.net>2007-04-23 14:57:37 +0000
committerAntony Dovgal <tony2001@php.net>2007-04-23 14:57:37 +0000
commit2bdfafadeb229b8cc7189011c43f567f382eeab8 (patch)
treecce67cf85deac7748ec81d49cac9112672a6fc2c /ext/gmp
parent84827aabc44a4ed23fb545a7dd4e781e3194c496 (diff)
downloadphp-git-2bdfafadeb229b8cc7189011c43f567f382eeab8.tar.gz
[DOC] add gmp_testbit() function
tests if the specified bit is set and returns false/true
Diffstat (limited to 'ext/gmp')
-rw-r--r--ext/gmp/gmp.c36
-rw-r--r--ext/gmp/php_gmp.h1
-rw-r--r--ext/gmp/tests/039.phpt79
3 files changed, 116 insertions, 0 deletions
diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c
index dca90ac1a4..ef1f44214b 100644
--- a/ext/gmp/gmp.c
+++ b/ext/gmp/gmp.c
@@ -242,6 +242,12 @@ ZEND_BEGIN_ARG_INFO(arginfo_gmp_clrbit, 0)
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_function_entry gmp_functions[] = {
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 @@ ZEND_FUNCTION(gmp_clrbit)
}
/* }}} */
+/* {{{ 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)
diff --git a/ext/gmp/php_gmp.h b/ext/gmp/php_gmp.h
index 22b4abcf48..ce208c3d4d 100644
--- a/ext/gmp/php_gmp.h
+++ b/ext/gmp/php_gmp.h
@@ -70,6 +70,7 @@ ZEND_FUNCTION(gmp_xor);
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);
diff --git a/ext/gmp/tests/039.phpt b/ext/gmp/tests/039.phpt
new file mode 100644
index 0000000000..084772288c
--- /dev/null
+++ b/ext/gmp/tests/039.phpt
@@ -0,0 +1,79 @@
+--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