Browse Source

moved lcg stuff to ext/standard

experimetnal/RETURN_REF_PATCH
Stig Bakken 27 years ago
parent
commit
5600f889b2
  1. 2
      ext/standard/Makefile.am
  2. 98
      ext/standard/lcg.c
  3. 43
      ext/standard/php_lcg.h
  4. 2
      main/internal_functions.c.in

2
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 $@

98
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
};

43
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

2
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@
};

Loading…
Cancel
Save