summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStig Bakken <ssb@php.net>1999-08-29 20:12:12 +0000
committerStig Bakken <ssb@php.net>1999-08-29 20:12:12 +0000
commit5600f889b2cb8d2b11b54d711273c40916c4b4fa (patch)
tree2e09d483a5e5d9ac5acb4bd602fbb3a19206e9eb
parent869eeb62f42ce1c1d8e17efaa70676988cbabdc8 (diff)
downloadphp-git-5600f889b2cb8d2b11b54d711273c40916c4b4fa.tar.gz
moved lcg stuff to ext/standard
-rw-r--r--ext/standard/Makefile.am2
-rw-r--r--ext/standard/lcg.c98
-rw-r--r--ext/standard/php_lcg.h43
-rw-r--r--main/internal_functions.c.in2
4 files changed, 144 insertions, 1 deletions
diff --git a/ext/standard/Makefile.am b/ext/standard/Makefile.am
index 0f4f063c8a..a0ca94e0aa 100644
--- a/ext/standard/Makefile.am
+++ b/ext/standard/Makefile.am
@@ -8,7 +8,7 @@ libphpext_standard_a_SOURCES=\
pack.c pageinfo.c rand.c reg.c soundex.c string.c \
syslog.c type.c uniqid.c url.c iptc.c var.c quot_print.c \
cyr_convert.c flock_compat.c crypt.c dl.c head.c post.c \
- parsedate.y
+ parsedate.y lcg.c
#number.o: number.c
# $(CC) $(CFLAGS) -w@WARNING_LEVEL@ -c $< -o $@
diff --git a/ext/standard/lcg.c b/ext/standard/lcg.c
new file mode 100644
index 0000000000..8fe4950aa0
--- /dev/null
+++ b/ext/standard/lcg.c
@@ -0,0 +1,98 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP version 4.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997, 1998, 1999 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.0 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available at through the world-wide-web at |
+ | http://www.php.net/license/2_0.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Sascha Schumann <ss@2ns.de> |
+ +----------------------------------------------------------------------+
+ */
+
+#include "php.h"
+#include "php_lcg.h"
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef ZTS
+int lcg_globals_id;
+#else
+static php_lcg_globals lcg_globals;
+#endif
+
+/*
+ * combinedLCG() returns a pseudo random number in the range of (0,1).
+ * The function combines two CGs with periods of
+ * 2^31 - 85 and 2^31 - 249. The period of this function
+ * is equal to the product of both primes.
+ */
+
+#define MODMULT(a,b,c,m,s) q = s/a;s=b*(s-a*q)-c*q;if(s<0)s+=m
+
+double php_combined_lcg(void)
+{
+ long q;
+ long z;
+ LCGLS_FETCH();
+
+ MODMULT(53668,40014,12211,2147483563L, LCG(s1));
+ MODMULT(52774,40692,3791, 2147483399L, LCG(s2));
+
+ z = LCG(s1) - LCG(s2);
+ if(z < 1) {
+ z += 2147483562;
+ }
+
+ return z * 4.656613e-10;
+}
+
+static void init_globals(LCGLS_D)
+{
+ LCG(s1) = 1;
+#ifdef ZTS
+ LCG(s2) = (long) tsrm_thread_id();
+#else
+ LCG(s2) = (long) getpid();
+#endif
+}
+
+static int php_minit_lcg(INIT_FUNC_ARGS)
+{
+#ifdef ZTS
+ lcg_globals_id = ts_allocate_id(sizeof(php_lcg_globals), init_globals, NULL);
+#else
+ init_globals();
+#endif
+ return SUCCESS;
+}
+
+/* {{{ proto double lcg_value()
+ returns a value from the combined linear congruential generator */
+PHP_FUNCTION(lcg_value)
+{
+ RETURN_DOUBLE(php_combined_lcg());
+}
+/* }}} */
+
+static function_entry lcg_functions[] = {
+ PHP_FE(lcg_value, NULL)
+ {0}
+};
+
+zend_module_entry lcg_module_entry = {
+ "LCG",
+ lcg_functions,
+ php_minit_lcg, NULL,
+ NULL, NULL,
+ NULL,
+ STANDARD_MODULE_PROPERTIES
+};
diff --git a/ext/standard/php_lcg.h b/ext/standard/php_lcg.h
new file mode 100644
index 0000000000..3476460dfa
--- /dev/null
+++ b/ext/standard/php_lcg.h
@@ -0,0 +1,43 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP version 4.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997, 1998, 1999 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.0 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available at through the world-wide-web at |
+ | http://www.php.net/license/2_0.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Sascha Schumann <ss@2ns.de> |
+ +----------------------------------------------------------------------+
+ */
+
+#ifndef PHP_LCG_H
+#define PHP_LCG_H
+
+typedef struct {
+ long s1;
+ long s2;
+} php_lcg_globals;
+
+double php_combined_lcg(void);
+PHP_FUNCTION(lcg_value);
+
+#ifdef ZTS
+#define LCGLS_D php_lcg_globals *lcg_globals
+#define LCG(v) (lcg_globals->v)
+#define LCGLS_FETCH() php_lcg_globals *lcg_globals = ts_resource(lcg_globals_id)
+#else
+#define LCGLS_D
+#define LCG(v) (lcg_globals.v)
+#define LCGLS_FETCH()
+#endif
+
+extern zend_module_entry lcg_module_entry;
+#define phpext_lcg_ptr &lcg_module_entry
+
+#endif
diff --git a/main/internal_functions.c.in b/main/internal_functions.c.in
index d849b80faf..d63679b52d 100644
--- a/main/internal_functions.c.in
+++ b/main/internal_functions.c.in
@@ -52,6 +52,7 @@
#include "ext/standard/php3_filestat.h"
#include "ext/standard/php3_mail.h"
#include "ext/standard/php3_syslog.h"
+#include "ext/standard/php_lcg.h"
@EXT_INCLUDE_CODE@
/* SNMP has to be moved to ext */
@@ -75,6 +76,7 @@ zend_module_entry *php3_builtin_modules[] = {
phpext_filestat_ptr,
phpext_mail_ptr,
phpext_syslog_ptr,
+ phpext_lcg_ptr,
@EXT_MODULE_PTRS@
};