summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.in743
-rw-r--r--acinclude.m4433
-rw-r--r--aclocal.m4132
-rw-r--r--configure.in776
-rw-r--r--configure.in.in1993
-rw-r--r--ext/Makefile.am8
-rw-r--r--ext/ereg/ereg.c569
-rw-r--r--ext/ereg/php_ereg.h48
-rw-r--r--ext/gd/Makefile.am4
-rw-r--r--ext/gd/config.m454
-rw-r--r--ext/gd/gd.c2
-rw-r--r--ext/gd/php3_gd.h102
-rw-r--r--ext/gd/setup.stub6
-rw-r--r--ext/standard/Makefile.am11
-rw-r--r--ext/standard/base64.c197
-rw-r--r--ext/standard/base64.h47
-rw-r--r--ext/standard/basic_functions.c2153
-rw-r--r--ext/standard/basic_functions.h130
-rw-r--r--ext/standard/browscap.c137
-rw-r--r--ext/standard/config.m43
-rw-r--r--ext/standard/cyr_convert.c301
-rw-r--r--ext/standard/cyr_convert.h40
-rw-r--r--ext/standard/datetime.c510
-rw-r--r--ext/standard/datetime.h51
-rw-r--r--ext/standard/dir.c287
-rw-r--r--ext/standard/dns.c343
-rw-r--r--ext/standard/dns.h53
-rw-r--r--ext/standard/exec.c388
-rw-r--r--ext/standard/exec.h43
-rw-r--r--ext/standard/file.c1435
-rw-r--r--ext/standard/file.h65
-rw-r--r--ext/standard/filestat.c509
-rw-r--r--ext/standard/formatted_print.c602
-rw-r--r--ext/standard/fsock.c477
-rw-r--r--ext/standard/fsock.h47
-rw-r--r--ext/standard/global.h58
-rw-r--r--ext/standard/html.c134
-rw-r--r--ext/standard/html.h38
-rw-r--r--ext/standard/image.c386
-rw-r--r--ext/standard/image.h36
-rw-r--r--ext/standard/info.c438
-rw-r--r--ext/standard/info.h40
-rw-r--r--ext/standard/iptc.c132
-rw-r--r--ext/standard/link.c214
-rw-r--r--ext/standard/mail.c188
-rw-r--r--ext/standard/math.c708
-rw-r--r--ext/standard/md5.c407
-rw-r--r--ext/standard/md5.h71
-rw-r--r--ext/standard/microtime.c88
-rw-r--r--ext/standard/microtime.h37
-rw-r--r--ext/standard/pack.c890
-rw-r--r--ext/standard/pack.h42
-rw-r--r--ext/standard/pageinfo.c159
-rw-r--r--ext/standard/pageinfo.h11
-rw-r--r--ext/standard/php3_browscap.h43
-rw-r--r--ext/standard/php3_dir.h48
-rw-r--r--ext/standard/php3_filestat.h64
-rw-r--r--ext/standard/php3_iptc.h38
-rw-r--r--ext/standard/php3_link.h41
-rw-r--r--ext/standard/php3_mail.h46
-rw-r--r--ext/standard/php3_standard.h71
-rw-r--r--ext/standard/php3_string.h99
-rw-r--r--ext/standard/php3_syslog.h44
-rw-r--r--ext/standard/php3_var.h42
-rw-r--r--ext/standard/phpdir.h44
-rw-r--r--ext/standard/phpmath.h70
-rw-r--r--ext/standard/quot_print.c109
-rw-r--r--ext/standard/quot_print.h37
-rw-r--r--ext/standard/rand.c343
-rw-r--r--ext/standard/reg.c569
-rw-r--r--ext/standard/reg.h48
-rw-r--r--ext/standard/soundex.c136
-rw-r--r--ext/standard/string.c1590
-rw-r--r--ext/standard/syslog.c296
-rw-r--r--ext/standard/type.c108
-rw-r--r--ext/standard/type.h41
-rw-r--r--ext/standard/uniqid.c103
-rw-r--r--ext/standard/uniqid.h37
-rw-r--r--ext/standard/url.c439
-rw-r--r--ext/standard/url.h60
-rw-r--r--ext/standard/var.c391
-rw-r--r--internal_functions.c21
-rw-r--r--main/configuration-parser.y4
-rw-r--r--main/fopen_wrappers.c5
-rw-r--r--main/main.c5
-rw-r--r--main/php_version.h2
-rw-r--r--main/safe_mode.c2
-rwxr-xr-xscripts/armerge67
-rwxr-xr-xscripts/config-stubs7
-rwxr-xr-xscripts/mkextlib.in17
-rwxr-xr-xscripts/preconfig7
-rw-r--r--setup17
92 files changed, 20745 insertions, 1142 deletions
diff --git a/Makefile.in b/Makefile.in
index 19158d1c3d..9f9bde9f08 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,7 +1,7 @@
# +----------------------------------------------------------------------+
-# | PHP HTML Embedded Scripting Language Version 3.0 |
+# | PHP HTML Embedded Scripting Language Version 4.0 |
# +----------------------------------------------------------------------+
-# | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+# | Copyright (c) 1997-1999 PHP Development Team (See Credits file) |
# +----------------------------------------------------------------------+
# | This program is free software; you can redistribute it and/or modify |
# | it under the terms of one of the following licenses: |
@@ -32,13 +32,15 @@ exec_prefix = @exec_prefix@
srcdir = @srcdir@
VPATH = @srcdir@
bindir = @bindir@
+
ZEND_DIR = $(srcdir)/libzend
+SUBDIRS=libzend ext
CC = @CC@
AR = ar rc
BINNAME = @BINNAME@
INSTALL_IT = @INSTALL_IT@
-INCLUDE = -I$(srcdir) -I. -I$(ZEND_DIR) @GDBM_INCLUDE@ @ORACLE_INCLUDE@ @APACHE_INCLUDE@ @FHTTPD_INCLUDE@ @ADA_INCLUDE@ @IODBC_INCLUDE@ @SYBASE_INCLUDE@ @SYBASE_CT_INCLUDE@ @MYSQL_INCLUDE@ @MSQL_INCLUDE@ @SOLID_INCLUDE@ @EMPRESS_INCLUDE@ @OPENLINK_INCLUDE@ @PGSQL_INCLUDE@ @LDAP_INCLUDE@ @VELOCIS_INCLUDE@ @CODBC_INCLUDE@ @GD_INCLUDE@ @IMAP_INCLUDE@ @ZLIB_INCLUDE@ @PDFLIB_INCLUDE@ @FDFLIB_INCLUDE@ @IFX_INCLUDE@ @SNMP_INCLUDE@ @IBASE_INCLUDE@
+INCLUDE = -I$(srcdir) -I. -I$(ZEND_DIR)
PROF_CFLAGS =
CFLAGS_SHLIB = @CFLAGS_SHLIB@
LDFLAGS_SHLIB = @LDFLAGS_SHLIB@
@@ -64,60 +66,55 @@ OBJS = main.o internal_functions.o snprintf.o php3_sprintf.o \
php_ini.o
FUNCTIONS_SOURCE = functions/adabasd.c functions/apache.c functions/fhttpd.c \
- functions/basic_functions.c \
- functions/crypt.c functions/datetime.c functions/db.c \
- functions/dbase.c functions/dir.c \
- functions/dl.c functions/dns.c functions/exec.c functions/file.c \
- functions/filepro.c functions/filestat.c \
- functions/formatted_print.c functions/fsock.c functions/gd.c \
- functions/head.c functions/html.c functions/image.c functions/imap.c\
- functions/link.c functions/mail.c functions/math.c functions/iptc.c \
- functions/md5.c functions/microtime.c functions/mime.c \
+ functions/crypt.c functions/db.c functions/dbase.c \
+ functions/dl.c functions/filepro.c \
+ functions/head.c functions/imap.c functions/mime.c \
functions/msql.c functions/mysql.c \
- functions/oracle.c functions/oci8.c functions/pack.c \
- functions/pageinfo.c functions/pgsql.c \
- functions/post.c functions/rand.c functions/reg.c \
- functions/solid.c functions/soundex.c \
- functions/string.c functions/syslog.c functions/type.c \
- functions/uniqid.c functions/sybase.c \
- functions/sybase-ct.c functions/url.c functions/base64.c \
- functions/info.c @BCMATH_SRC@ functions/xml.c \
- functions/unified_odbc.c functions/ldap.c functions/browscap.c \
- functions/velocis.c functions/gdttf.c functions/gdcache.c \
+ functions/oracle.c functions/oci8.c functions/pgsql.c \
+ functions/post.c functions/solid.c functions/sybase.c \
+ functions/sybase-ct.c @BCMATH_SRC@ functions/xml.c \
+ functions/unified_odbc.c functions/ldap.c functions/velocis.c \
functions/zlib.c functions/COM.c functions/ifx.c \
functions/pdf.c functions/hw.c functions/hg_comm.c functions/dlist.c \
- functions/fdf.c \
- functions/snmp.c functions/var.c functions/interbase.c \
- functions/quot_print.c functions/cyr_convert.c \
+ functions/fdf.c functions/snmp.c functions/interbase.c \
functions/sysvsem.c functions/sysvshm.c functions/dav.c
FUNCTIONS = $(FUNCTIONS_SOURCE:.c=.o)
-
-LIBS = $(PHPLIBS) @SYBASE_CT_LFLAGS@ @SYBASE_CT_LIBS@ @FHTTPD_LIB@ @DBASE_LIB@ @REGEX_LIB@ @DBM_LIB@ @ORACLE_LFLAGS@ @ORACLE_LIBS@ @IODBC_LFLAGS@ @IODBC_LIBS@ @SYBASE_LFLAGS@ @SYBASE_LIBS@ @SYBASE_CT_LFLAGS@ @SYBASE_CT_LIBS@ @MYSQL_LFLAGS@ @MYSQL_LIBS@ @MSQL_LFLAGS@ @MSQL_LIBS@ @ADA_LFLAGS@ @ADA_LIBS@ @SOLID_LIBS@ @EMPRESS_LIBS@ @OPENLINK_LFLAGS@ @OPENLINK_LIBS@ @PGSQL_LFLAGS@ @PGSQL_LIBS@ @LDAP_LFLAGS@ @LDAP_LIBS@ @VELOCIS_LIBS@ @CODBC_LFLAGS@ @CODBC_LIBS@ @IMAP_LIBS@ @GD_LIBS@ @ZLIB_LIBS@ @PDFLIB_LIBS@ @FDFLIB_LIBS@ @IFX_LFLAGS@ @IFX_LIBS@ @SNMP_LFLAGS@ @SNMP_LIBS@ @IBASE_LFLAGS@ @IBASE_LIBS@ @XML_LIBS@ @LIBS@
+PHPLIBS = -L@top_srcdir@/libzend -lzend -L@top_srcdir@/ext -lphpext
+LIBS = $(PHPLIBS) @SYBASE_CT_LFLAGS@ @SYBASE_CT_LIBS@ @FHTTPD_LIB@ @DBASE_LIB@ @REGEX_LIB@ @DBM_LIB@ @ORACLE_LFLAGS@ @ORACLE_LIBS@ @IODBC_LFLAGS@ @IODBC_LIBS@ @SYBASE_LFLAGS@ @SYBASE_LIBS@ @SYBASE_CT_LFLAGS@ @SYBASE_CT_LIBS@ @MYSQL_LFLAGS@ @MYSQL_LIBS@ @MSQL_LFLAGS@ @MSQL_LIBS@ @ADA_LFLAGS@ @ADA_LIBS@ @SOLID_LIBS@ @EMPRESS_LIBS@ @OPENLINK_LFLAGS@ @OPENLINK_LIBS@ @PGSQL_LFLAGS@ @PGSQL_LIBS@ @LDAP_LFLAGS@ @LDAP_LIBS@ @VELOCIS_LIBS@ @CODBC_LFLAGS@ @CODBC_LIBS@ @IMAP_LIBS@ @ZLIB_LIBS@ @PDFLIB_LIBS@ @FDFLIB_LIBS@ @IFX_LFLAGS@ @IFX_LIBS@ @SNMP_LFLAGS@ @SNMP_LIBS@ @IBASE_LFLAGS@ @IBASE_LIBS@ @XML_LIBS@ @LIBS@
all: $(BINNAME)
-php: $(OBJS) $(FUNCTIONS) @REGEX_LIB@ @FHTTPD_LIB@ @DBASE_LIB@ $(ZEND_DIR)/libzend.a
+all-recursive clean-recursive distclean-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ for subdir in $(SUBDIRS); do \
+ target=`echo $@ | sed s/-recursive//`; \
+ echo "Making $$target in $$subdir"; \
+ (cd $$subdir && $(MAKE) $$target) || fail=yes; \
+ done && test -z "$$fail"
+
+# CGI binary or fhttpd module
+php: all-recursive $(OBJS) $(FUNCTIONS) @REGEX_LIB@ @FHTTPD_LIB@ @DBASE_LIB@
$(CC) $(CFLAGS) -o $(BINNAME) $(LDFLAGS) $(OBJS) $(FUNCTIONS) $(LIBS)
-libphp3.a: $(OBJS) $(FUNCTIONS) @DBASE_LIB@
+# Apache 1.2 module
+libphp3.a: all-recursive $(OBJS) $(FUNCTIONS) @DBASE_LIB@
$(AR) $(BINNAME) $(OBJS) $(FUNCTIONS) @DBASE_LIB@
$(RANLIB) $(BINNAME)
-libmodphp3.a: $(OBJS) $(FUNCTIONS) @DBASE_LIB@
+# Apache 1.3 static module
+libmodphp3.a: all-recursive $(OBJS) $(FUNCTIONS) @DBASE_LIB@
$(AR) $(BINNAME) $(OBJS) $(FUNCTIONS) @DBASE_LIB@
$(RANLIB) $(BINNAME)
-libmodphp3-so.a: $(OBJS) $(FUNCTIONS) @DBASE_LIB@
+# Apache 1.3 shared module
+libmodphp3-so.a: all-recursive $(OBJS) $(FUNCTIONS) @DBASE_LIB@
$(AR) libmodphp3-so.a $(OBJS) $(FUNCTIONS) @DBASE_LIB@
$(RANLIB) libmodphp3-so.a
libphp3.so: mod_php3.c libmodphp3-so.a
$(APXS) -c -o libphp3.so $(APXS_LDFLAGS) mod_php3.c libmodphp3-so.a
-docs:
- cd doc; $(MAKE)
-
regex/libregex.a:
(cd regex; $(MAKE) lib)
@@ -136,14 +133,14 @@ configuration-scanner.o:
configuration-scanner.c: $(srcdir)/configuration-scanner.l
flex -Pcfg -oconfiguration-scanner.c -i $(srcdir)/configuration-scanner.l
-clean:
+clean: clean-recursive
-rm -f libphp3.a libmodphp3.a php *.o
-rm -f $(FUNCTIONS) functions/ifx.c
-rm -f test/php.desc test/php.in test/php.out test/php.test
-rm -f test/a.tmp test/b.tmp test/test.dbm*
(cd dbase; $(MAKE) clean)
-distclean: clean
+distclean: clean distclean-recursive
-rm -f *-parser.[ch] *-scanner.c *.output
-rm -f config.status config.cache config.log
-rm -f Makefile Makefile.depend config.h build-defs.h
@@ -210,680 +207,6 @@ depend: parser-scanner
$(CC) $(CFLAGS) -MM $(SOURCE) | perl -pe 's|regex/regex.h||;' > Makefile.depend
$(CC) $(CFLAGS) -MM $(FUNCTIONS_SOURCE) | perl -pe 's|^(.+\.o)|functions/$$1|; s|regex/regex.h||;' >> Makefile.depend
-main.o: main.c php.h php_version.h libzend/zend.h libzend/config.h \
- libzend/config.unix.h libzend/zend_errors.h libzend/zend_alloc.h \
- libzend/zend_hash.h libzend/zend_llist.h libzend/zend_API.h \
- libzend/modules.h libzend/zend_list.h config.h request_info.h \
- php3_compat.h libzend/zend_stack.h safe_mode.h \
- fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h build-defs.h \
- php_ini.h php_globals.h main.h libzend/zend_globals.h \
- libzend/zend_ptr_stack.h libzend/zend_compile.h libzend/zend-parser.h \
- libzend/zend_execute.h control_structures.h \
- functions/basic_functions.h libzend/zend_highlight.h functions/info.h \
- functions/head.h functions/post.h functions/type.h snprintf.h \
- libzend/zend_indent.h logos.h
-internal_functions.o: internal_functions.c php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h config.h request_info.h php3_compat.h \
- libzend/zend_stack.h safe_mode.h fopen-wrappers.h \
- output.h libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h internal_functions_registry.h \
- libzend/zend_compile.h libzend/zend-parser.h libzend/zend_globals.h \
- libzend/zend_ptr_stack.h libzend/zend_execute.h functions/php3_ifx.h \
- functions/php3_ldap.h functions/php3_mysql.h functions/php3_bcmath.h \
- functions/php3_msql.h functions/basic_functions.h \
- libzend/zend_highlight.h functions/phpmath.h functions/php3_string.h \
- functions/php3_oci8.h functions/oracle.h functions/base64.h \
- functions/php3_dir.h functions/dns.h functions/php3_pgsql.h \
- functions/php3_velocis.h functions/php3_sybase.h \
- functions/php3_sybase-ct.h functions/reg.h functions/php3_mail.h \
- functions/imap.h functions/md5.h functions/global.h \
- functions/php3_gd.h functions/html.h functions/dl.h functions/head.h \
- functions/post.h functions/exec.h functions/php3_solid.h \
- functions/adabasd.h functions/file.h functions/dbase.h functions/hw.h \
- functions/filepro.h functions/db.h functions/php3_syslog.h \
- functions/php3_filestat.h functions/php3_browscap.h functions/pack.h \
- functions/php3_unified_odbc.h dl/snmp/php3_snmp.h \
- functions/php3_zlib.h functions/php3_COM.h functions/php3_interbase.h \
- functions/php3_xml.h functions/php3_pdf.h functions/php3_fdf.h \
- functions/php3_sysvsem.h functions/php3_sysvshm.h \
- functions/php3_dav.h
-snprintf.o: snprintf.c config.h
-php3_sprintf.o: php3_sprintf.c config.h
-configuration-parser.o: configuration-parser.c php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h config.h request_info.h php3_compat.h \
- libzend/zend_stack.h safe_mode.h fopen-wrappers.h \
- output.h libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h php_globals.h php_ini.h functions/dl.h \
- functions/file.h functions/php3_browscap.h libzend/zend_extensions.h \
- libzend/zend_compile.h libzend/zend-parser.h libzend/zend_globals.h \
- libzend/zend_ptr_stack.h libzend/zend_execute.h
-configuration-scanner.o: configuration-scanner.c php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h config.h request_info.h php3_compat.h \
- libzend/zend_stack.h safe_mode.h fopen-wrappers.h \
- output.h libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h configuration-parser.h
-request_info.o: request_info.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h
-safe_mode.o: safe_mode.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/pageinfo.h
-fopen-wrappers.o: fopen-wrappers.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h php_globals.h \
- php3_realpath.h functions/head.h functions/url.h functions/base64.h \
- functions/fsock.h functions/php3_string.h libzend/zend_compile.h \
- libzend/zend-parser.h libzend/zend_globals.h libzend/zend_ptr_stack.h \
- libzend/zend_execute.h
-php3_realpath.o: php3_realpath.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h
-alloca.o: alloca.c
-output.o: output.c php.h php_version.h libzend/zend.h libzend/config.h \
- libzend/config.unix.h libzend/zend_errors.h libzend/zend_alloc.h \
- libzend/zend_hash.h libzend/zend_llist.h libzend/zend_API.h \
- libzend/modules.h libzend/zend_list.h config.h request_info.h \
- php3_compat.h libzend/zend_stack.h safe_mode.h \
- fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/head.h
-php_ini.o: php_ini.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h php_ini.h \
- php_globals.h
-functions/adabasd.o: functions/adabasd.c config.h build-defs.h php.h \
- php_version.h libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h \
- libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h functions/php3_string.h functions/head.h \
- functions/adabasd.h
-functions/apache.o: functions/apache.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/head.h \
- php_globals.h php_ini.h mod_php3.h
-functions/fhttpd.o: functions/fhttpd.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h
-functions/basic_functions.o: functions/basic_functions.c php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h config.h request_info.h php3_compat.h \
- libzend/zend_stack.h safe_mode.h fopen-wrappers.h \
- output.h libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h php_ini.h internal_functions_registry.h \
- functions/basic_functions.h libzend/zend_highlight.h \
- functions/phpmath.h functions/php3_string.h functions/dns.h \
- functions/md5.h functions/global.h functions/html.h functions/post.h \
- functions/exec.h functions/info.h functions/url.h \
- functions/datetime.h functions/fsock.h functions/image.h \
- functions/php3_link.h functions/php3_filestat.h functions/microtime.h \
- functions/pageinfo.h functions/uniqid.h functions/base64.h \
- functions/php3_mail.h functions/php3_var.h functions/php3_iptc.h \
- functions/quot_print.h functions/cyr_convert.h libzend/zend_globals.h \
- libzend/zend_ptr_stack.h libzend/zend_compile.h libzend/zend-parser.h \
- libzend/zend_execute.h php_globals.h
-functions/crypt.o: functions/crypt.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_string.h
-functions/datetime.o: functions/datetime.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/datetime.h snprintf.h php_globals.h
-functions/db.o: functions/db.c
-functions/dbase.o: functions/dbase.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h php_globals.h
-functions/dir.o: functions/dir.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_dir.h
-functions/dl.o: functions/dl.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/dl.h \
- php_globals.h
-functions/dns.o: functions/dns.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/dns.h
-functions/exec.o: functions/exec.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_string.h functions/head.h functions/exec.h \
- php_globals.h
-functions/file.o: functions/file.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/head.h \
- functions/php3_string.h functions/file.h snprintf.h functions/fsock.h \
- php_globals.h
-functions/filepro.o: functions/filepro.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h php_globals.h \
- functions/filepro.h
-functions/filestat.o: functions/filestat.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h php_globals.h \
- functions/php3_filestat.h
-functions/formatted_print.o: functions/formatted_print.c php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h config.h request_info.h php3_compat.h \
- libzend/zend_stack.h safe_mode.h fopen-wrappers.h \
- output.h libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h functions/head.h functions/php3_string.h \
- libzend/zend_execute.h libzend/zend_compile.h libzend/zend-parser.h \
- libzend/zend_globals.h libzend/zend_ptr_stack.h
-functions/fsock.o: functions/fsock.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/base64.h \
- functions/file.h functions/post.h functions/url.h functions/fsock.h \
- build-defs.h
-functions/gd.o: functions/gd.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/head.h \
- functions/php3_gd.h
-functions/head.o: functions/head.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/reg.h \
- functions/php3_string.h functions/pageinfo.h main.h \
- libzend/zend_globals.h libzend/zend_ptr_stack.h \
- libzend/zend_compile.h libzend/zend-parser.h libzend/zend_execute.h \
- functions/datetime.h functions/head.h functions/post.h php_globals.h \
- functions/url.h
-functions/html.o: functions/html.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/reg.h \
- functions/html.h
-functions/image.o: functions/image.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/image.h
-functions/imap.o: functions/imap.c config.h php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h
-functions/link.o: functions/link.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_filestat.h php_globals.h functions/php3_link.h
-functions/mail.o: functions/mail.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h build-defs.h \
- functions/php3_mail.h php_ini.h
-functions/math.o: functions/math.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/phpmath.h \
- snprintf.h
-functions/iptc.o: functions/iptc.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_iptc.h
-functions/md5.o: functions/md5.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/md5.h \
- functions/global.h
-functions/microtime.o: functions/microtime.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/microtime.h snprintf.h
-functions/mime.o: functions/mime.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/type.h \
- functions/post.h functions/mime.h libzend/zend_globals.h \
- libzend/zend_ptr_stack.h libzend/zend_compile.h libzend/zend-parser.h \
- libzend/zend_execute.h php_globals.h
-functions/msql.o: functions/msql.c config.h php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_msql.h functions/reg.h functions/php3_string.h \
- php_globals.h
-functions/mysql.o: functions/mysql.c config.h build-defs.h php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h \
- libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h php_globals.h functions/php3_string.h \
- functions/php3_mysql.h php_ini.h
-functions/oracle.o: functions/oracle.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/oracle.h
-functions/oci8.o: functions/oci8.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_oci8.h
-functions/pack.o: functions/pack.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/head.h \
- functions/php3_string.h functions/pack.h snprintf.h functions/fsock.h
-functions/pageinfo.o: functions/pageinfo.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/pageinfo.h
-functions/pgsql.o: functions/pgsql.c config.h php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_pgsql.h functions/php3_string.h php_globals.h
-functions/post.o: functions/post.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/mime.h \
- functions/type.h functions/php3_string.h functions/post.h \
- functions/url.h php_globals.h libzend/zend_globals.h \
- libzend/zend_ptr_stack.h libzend/zend_compile.h libzend/zend-parser.h \
- libzend/zend_execute.h
-functions/rand.o: functions/rand.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/phpmath.h
-functions/reg.o: functions/reg.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_string.h functions/reg.h
-functions/solid.o: functions/solid.c config.h build-defs.h php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h \
- libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h functions/php3_solid.h
-functions/soundex.o: functions/soundex.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_string.h
-functions/string.o: functions/string.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/reg.h \
- functions/post.h functions/php3_string.h libzend/zend_execute.h \
- libzend/zend_compile.h libzend/zend-parser.h libzend/zend_globals.h \
- libzend/zend_ptr_stack.h php_globals.h
-functions/syslog.o: functions/syslog.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h php_ini.h \
- libzend/zend_globals.h libzend/zend_ptr_stack.h \
- libzend/zend_compile.h libzend/zend-parser.h libzend/zend_execute.h \
- functions/php3_syslog.h
-functions/type.o: functions/type.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/type.h
-functions/uniqid.o: functions/uniqid.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/uniqid.h
-functions/sybase.o: functions/sybase.c config.h php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h \
- libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h functions/php3_sybase.h \
- functions/php3_string.h php_globals.h
-functions/sybase-ct.o: functions/sybase-ct.c config.h php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h \
- libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h functions/php3_sybase-ct.h \
- functions/php3_string.h php_globals.h
-functions/url.o: functions/url.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/url.h
-functions/base64.o: functions/base64.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/base64.h
-functions/info.o: functions/info.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h php_ini.h \
- php_globals.h functions/head.h functions/info.h build-defs.h \
- libzend/zend_globals.h libzend/zend_ptr_stack.h \
- libzend/zend_compile.h libzend/zend-parser.h libzend/zend_execute.h
-functions/bcmath.o: functions/bcmath.c config.h build-defs.h php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h \
- libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h functions/number.h functions/php3_bcmath.h
-functions/number.o: functions/number.c functions/number.h php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h config.h request_info.h php3_compat.h \
- libzend/zend_stack.h safe_mode.h fopen-wrappers.h \
- output.h libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h
-functions/xml.o: functions/xml.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_xml.h
-functions/unified_odbc.o: functions/unified_odbc.c config.h build-defs.h php.h \
- php_version.h libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h \
- libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h dl/phpdl.h functions/php3_string.h \
- functions/php3_unified_odbc.h functions/head.h snprintf.h
-functions/ldap.o: functions/ldap.c config.h php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h
-functions/browscap.o: functions/browscap.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_browscap.h php_ini.h libzend/zend_globals.h \
- libzend/zend_ptr_stack.h libzend/zend_compile.h libzend/zend-parser.h \
- libzend/zend_execute.h
-functions/velocis.o: functions/velocis.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_velocis.h
-functions/gdttf.o: functions/gdttf.c config.h
-functions/gdcache.o: functions/gdcache.c config.h
-functions/zlib.o: functions/zlib.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/head.h \
- functions/php3_string.h functions/php3_zlib.h snprintf.h
-functions/COM.o: functions/COM.c
-functions/pdf.o: functions/pdf.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/head.h \
- functions/php3_pdf.h
-functions/hw.o: functions/hw.c config.h php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/head.h
-functions/hg_comm.o: functions/hg_comm.c config.h
-functions/dlist.o: functions/dlist.c config.h
-functions/fdf.o: functions/fdf.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/head.h \
- functions/php3_fdf.h
-functions/snmp.o: functions/snmp.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_snmp.h
-functions/var.o: functions/var.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h functions/reg.h \
- functions/post.h functions/php3_string.h functions/php3_var.h
-functions/interbase.o: functions/interbase.c config.h php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h \
- libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h functions/php3_interbase.h
-functions/quot_print.o: functions/quot_print.c php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h config.h request_info.h php3_compat.h \
- libzend/zend_stack.h safe_mode.h fopen-wrappers.h \
- output.h libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h functions/quot_print.h
-functions/cyr_convert.o: functions/cyr_convert.c php.h php_version.h \
- libzend/zend.h libzend/config.h libzend/config.unix.h \
- libzend/zend_errors.h libzend/zend_alloc.h libzend/zend_hash.h \
- libzend/zend_llist.h libzend/zend_API.h libzend/modules.h \
- libzend/zend_list.h config.h request_info.h php3_compat.h \
- libzend/zend_stack.h safe_mode.h fopen-wrappers.h \
- output.h libzend/zend_operators.h libzend/zend_variables.h \
- libzend/zend_constants.h functions/cyr_convert.h
-functions/sysvsem.o: functions/sysvsem.c config.h
-functions/sysvshm.o: functions/sysvshm.c config.h
-functions/dav.o: functions/dav.c php.h php_version.h libzend/zend.h \
- libzend/config.h libzend/config.unix.h libzend/zend_errors.h \
- libzend/zend_alloc.h libzend/zend_hash.h libzend/zend_llist.h \
- libzend/zend_API.h libzend/modules.h libzend/zend_list.h config.h \
- request_info.h php3_compat.h libzend/zend_stack.h \
- safe_mode.h fopen-wrappers.h output.h libzend/zend_operators.h \
- libzend/zend_variables.h libzend/zend_constants.h \
- functions/php3_dav.h
-
# Local Variables:
# tab-width: 4
# End:
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644
index 0000000000..b4220b29f2
--- /dev/null
+++ b/acinclude.m4
@@ -0,0 +1,433 @@
+dnl $Id$
+dnl
+dnl This file contains local autoconf functions.
+
+AC_DEFUN(AC_ORACLE_VERSION,[
+ AC_MSG_CHECKING([Oracle version])
+ if test -f "$ORACLEINST_TOP/orainst/unix.rgs"
+ then
+ ORACLE_VERSION=`grep '"ocommon"' $ORACLEINST_TOP/orainst/unix.rgs | sed 's/[ ][ ]*/:/g' | cut -d: -f 6 | cut -c 2-4`
+ test -z "$ORACLE_VERSION" && ORACLE_VERSION=7.3
+ else
+ ORACLE_VERSION=8.0
+ fi
+ AC_MSG_RESULT($ORACLE_VERSION)
+])
+
+dnl
+dnl Test mSQL version by checking if msql.h has "IDX_TYPE" defined.
+dnl
+AC_DEFUN(AC_MSQL_VERSION,[
+ AC_MSG_CHECKING([mSQL version])
+ ac_php_oldcflags=$CFLAGS
+ CFLAGS="$MSQL_INCLUDE $CFLAGS";
+ AC_TRY_COMPILE([#include <sys/types.h>
+#include "msql.h"],[int i = IDX_TYPE],[
+ AC_DEFINE(MSQL1,0)
+ MSQL_VERSION="2.0 or newer"
+ ],[
+ AC_DEFINE(MSQL1,1)
+ MSQL_VERSION="1.0"
+ ])
+ CFLAGS=$ac_php_oldcflags
+ AC_MSG_RESULT($MSQL_VERSION)
+])
+
+dnl
+dnl Figure out which library file to link with for the Solid support.
+dnl
+AC_DEFUN(AC_FIND_SOLID_LIBS,[
+ AC_MSG_CHECKING([Solid library file])
+ ac_solid_uname_s=`uname -s 2>/dev/null`
+ case $ac_solid_uname_s in
+ AIX) ac_solid_os=a3x;;
+ HP-UX) ac_solid_os=h9x;;
+ IRIX) ac_solid_os=irx;;
+ Linux) ac_solid_os=lux;;
+ SunOS) ac_solid_os=ssx;; # should we deal with SunOS 4?
+ FreeBSD) ac_solid_os=fbx;;
+ # "uname -s" on SCO makes no sense.
+ esac
+ SOLID_LIBS=`echo $1/scl${ac_solid_os}*.so | cut -d' ' -f1`
+ if test ! -f $SOLID_LIBS; then
+ SOLID_LIBS=`echo $1/scl${ac_solid_os}*.a | cut -d' ' -f1`
+ fi
+ if test ! -f $SOLID_LIBS; then
+ SOLID_LIBS=`echo $1/scl2x${ac_solid_os}*.a | cut -d' ' -f1`
+ fi
+ if test ! -f $SOLID_LIBS; then
+ SOLID_LIBS=`echo $1/scl2x${ac_solid_os}*.a | cut -d' ' -f1`
+ fi
+ if test ! -f $SOLID_LIBS; then
+ SOLID_LIBS=`echo $1/bcl${ac_solid_os}*.so | cut -d' ' -f1`
+ fi
+ if test ! -f $SOLID_LIBS; then
+ SOLID_LIBS=`echo $1/bcl${ac_solid_os}*.a | cut -d' ' -f1`
+ fi
+ AC_MSG_RESULT(`echo $SOLID_LIBS | sed -e 's!.*/!!'`)
+])
+
+dnl
+dnl Figure out which library file to link with for the Empress support.
+dnl
+AC_DEFUN(AC_FIND_EMPRESS_LIBS,[
+ AC_MSG_CHECKING([Empress library file])
+ EMPRESS_LIBS=`echo $1/empodbc.so | cut -d' ' -f1`
+ if test ! -f $EMPRESS_LIBS; then
+ EMPRESS_LIBS=`echo $1/empodbc.a | cut -d' ' -f1`
+ fi
+ AC_MSG_RESULT(`echo $EMPRESS_LIBS | sed -e 's!.*/!!'`)
+])
+
+
+dnl
+dnl See if we have broken header files like SunOS has.
+dnl
+AC_DEFUN(AC_MISSING_FCLOSE_DECL,[
+ AC_MSG_CHECKING([for fclose declaration])
+ AC_TRY_COMPILE([#include <stdio.h>],[int (*func)() = fclose],[
+ AC_DEFINE(MISSING_FCLOSE_DECL,0)
+ AC_MSG_RESULT(ok)
+ ],[
+ AC_DEFINE(MISSING_FCLOSE_DECL,1)
+ AC_MSG_RESULT(missing)
+ ])
+])
+
+# Checks for libraries.
+# Prefer gdbm, Berkeley DB and ndbm/dbm, in that order
+AC_DEFUN(AC_PREFERRED_DB_LIB,[
+ AC_CHECK_LIB(gdbm, gdbm_open,[AC_DEFINE(GDBM) DBM_TYPE=gdbm; DBM_LIB=-lgdbm],
+ [AC_CHECK_LIB(db, dbm_open,[AC_DEFINE(NDBM) DBM_TYPE=ndbm; DBM_LIB=-ldb],
+ [AC_CHECK_LIB(c, dbm_open,[AC_DEFINE(NDBM) DBM_TYPE=ndbm; DBM_LIB=],
+ [AC_CHECK_LIB(dbm, dbm_open,[AC_DEFINE(NDBM) DBM_TYPE=ndbm; DBM_LIB=-ldbm],
+ [DBM_TYPE=""])])])])
+ AC_MSG_CHECKING([preferred dbm library])
+ if test "a$DBM_TYPE" = a; then
+ AC_MSG_RESULT(none found)
+ AC_MSG_WARN(No dbm library found - using built-in flatfile support)
+ else
+ AC_MSG_RESULT($DBM_TYPE chosen)
+ fi
+ AC_SUBST(DBM_LIB)
+ AC_SUBST(DBM_TYPE)
+])
+
+dnl
+dnl Check for broken sprintf()
+dnl
+AC_DEFUN(AC_BROKEN_SPRINTF,[
+ AC_MSG_CHECKING([for broken sprintf])
+ AC_TRY_RUN([main() { char buf[20]; exit (sprintf(buf,"testing 123")!=11); }],[
+ AC_DEFINE(BROKEN_SPRINTF,0)
+ AC_MSG_RESULT(ok)
+ ],[
+ AC_DEFINE(BROKEN_SPRINTF,1)
+ AC_MSG_RESULT(broken)
+ ],[
+ AC_DEFINE(BROKEN_SPRINTF,0)
+ AC_MSG_RESULT(cannot check, guessing ok)
+ ])
+])
+
+dnl
+dnl Check for crypt() capabilities
+dnl
+AC_DEFUN(AC_CRYPT_CAP,[
+
+ AC_MSG_CHECKING([for standard DES crypt])
+ AC_TRY_RUN([
+main() {
+#if HAVE_CRYPT
+ exit (strcmp((char *)crypt("rasmuslerdorf","rl"),"rl.3StKT.4T8M"));
+#else
+ exit(0);
+#endif
+}],[
+ AC_DEFINE(PHP3_STD_DES_CRYPT,1)
+ AC_MSG_RESULT(yes)
+ ],[
+ AC_DEFINE(PHP3_STD_DES_CRYPT,0)
+ AC_MSG_RESULT(no)
+ ],[
+ AC_DEFINE(PHP3_STD_DES_CRYPT,1)
+ AC_MSG_RESULT(cannot check, guessing yes)
+ ])
+
+ AC_MSG_CHECKING([for extended DES crypt])
+ AC_TRY_RUN([
+main() {
+#if HAVE_CRYPT
+ exit (strcmp((char *)crypt("rasmuslerdorf","_J9..rasm"),"_J9..rasmBYk8r9AiWNc"));
+#else
+ exit(0);
+#endif
+}],[
+ AC_DEFINE(PHP3_EXT_DES_CRYPT,1)
+ AC_MSG_RESULT(yes)
+ ],[
+ AC_DEFINE(PHP3_EXT_DES_CRYPT,0)
+ AC_MSG_RESULT(no)
+ ],[
+ AC_DEFINE(PHP3_EXT_DES_CRYPT,0)
+ AC_MSG_RESULT(cannot check, guessing no)
+ ])
+
+ AC_MSG_CHECKING([for MD5 crypt])
+ AC_TRY_RUN([
+main() {
+#if HAVE_CRYPT
+ char salt[15], answer[40];
+
+ salt[0]='$'; salt[1]='1'; salt[2]='$';
+ salt[3]='r'; salt[4]='a'; salt[5]='s';
+ salt[6]='m'; salt[7]='u'; salt[8]='s';
+ salt[9]='l'; salt[10]='e'; salt[11]='$';
+ salt[12]='\0';
+ strcpy(answer,salt);
+ strcat(answer,"rISCgZzpwk3UhDidwXvin0");
+ exit (strcmp((char *)crypt("rasmuslerdorf",salt),answer));
+#else
+ exit(0);
+#endif
+}],[
+ AC_DEFINE(PHP3_MD5_CRYPT,1)
+ AC_MSG_RESULT(yes)
+ ],[
+ AC_DEFINE(PHP3_MD5_CRYPT,0)
+ AC_MSG_RESULT(no)
+ ],[
+ AC_DEFINE(PHP3_MD5_CRYPT,0)
+ AC_MSG_RESULT(cannot check, guessing no)
+ ])
+
+ AC_MSG_CHECKING([for Blowfish crypt])
+ AC_TRY_RUN([
+main() {
+#if HAVE_CRYPT
+ char salt[25], answer[70];
+
+ salt[0]='$'; salt[1]='2'; salt[2]='a'; salt[3]='$'; salt[4]='0'; salt[5]='7'; salt[6]='$'; salt[7]='\0';
+ strcat(salt,"rasmuslerd");
+ strcpy(answer,salt);
+ strcpy(&answer[16],"O............gl95GkTKn53Of.H4YchXl5PwvvW.5ri");
+ exit (strcmp((char *)crypt("rasmuslerdorf",salt),answer));
+#else
+ exit(0);
+#endif
+}],[
+ AC_DEFINE(PHP3_BLOWFISH_CRYPT,1)
+ AC_MSG_RESULT(yes)
+ ],[
+ AC_DEFINE(PHP3_BLOWFISH_CRYPT,0)
+ AC_MSG_RESULT(no)
+ ],[
+ AC_DEFINE(PHP3_BLOWFISH_CRYPT,0)
+ AC_MSG_RESULT(cannot check, guessing no)
+ ])
+])
+
+## libtool.m4 - Configure libtool for the target system. -*-Shell-script-*-
+## Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+## Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+##
+## As a special exception to the GNU General Public License, if you
+## distribute this file as part of a program that contains a
+## configuration script generated by Autoconf, you may include it under
+## the same distribution terms that you use for the rest of that program.
+
+# serial 9 AM_PROG_LIBTOOL
+AC_DEFUN(AM_PROG_LIBTOOL,
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_RANLIB])
+AC_REQUIRE([AM_PROG_LD])
+AC_REQUIRE([AC_PROG_LN_S])
+
+# Always use our own libtool.
+LIBTOOL='$(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)
+
+dnl Allow the --disable-shared flag to stop us from building shared libs.
+AC_ARG_ENABLE(shared,
+[ --enable-shared build shared libraries [default=yes]],
+test "$enableval" = no && libtool_shared=" --disable-shared",
+libtool_shared=)
+
+dnl Allow the --disable-static flag to stop us from building static libs.
+AC_ARG_ENABLE(static,
+[ --enable-static build static libraries [default=yes]],
+test "$enableval" = no && libtool_static=" --disable-static",
+libtool_static=)
+
+libtool_flags="$libtool_shared$libtool_static"
+test "$silent" = yes && libtool_flags="$libtool_flags --silent"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+[case "$host" in
+*-*-irix6*)
+ for f in '-32' '-64' '-cckr' '-n32' '-mips1' '-mips2' '-mips3' '-mips4'; do
+ if echo " $CC $CFLAGS " | egrep -e "[ ]$f[ ]" > /dev/null; then
+ LD="${LD-ld} $f"
+ fi
+ done
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ CFLAGS="$CFLAGS -belf"
+ ;;
+esac]
+
+# Actually configure libtool. ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" RANLIB="$RANLIB" LN_S="$LN_S" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
+|| AC_MSG_ERROR([libtool configure failed])
+])
+
+# AM_PROG_LD - find the path to the GNU or non-GNU linker
+AC_DEFUN(AM_PROG_LD,
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+if test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(ac_cv_path_LD,
+[case "$LD" in
+ /*)
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/ld"; then
+ ac_cv_path_LD="$ac_dir/ld"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU ld|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" = yes && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac])
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_SUBST(LD)
+AM_PROG_LD_GNU
+])
+
+AC_DEFUN(AM_PROG_LD_GNU,
+[AC_CACHE_CHECK([whether we are using GNU ld], ac_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU ld|with BFD)' > /dev/null; then
+ ac_cv_prog_gnu_ld=yes
+else
+ ac_cv_prog_gnu_ld=no
+fi])
+])
+
+# the following 'borrwed' from automake until we switch over
+# Add --enable-maintainer-mode option to configure.
+# From Jim Meyering
+
+# serial 1
+
+AC_DEFUN(AM_MAINTAINER_MODE,
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ AC_MSG_RESULT($USE_MAINTAINER_MODE)
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINT=
+ else
+ MAINT='#M#'
+ fi
+ AC_SUBST(MAINT)dnl
+]
+)
+
+# another one stolen from automake temporarily
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN(AM_SANITY_CHECK,
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "$@" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ test "[$]2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl
+dnl Stuff to do when setting up a new extension.
+dnl XXX have to change the hardcoding of ".a" when we want to be able
+dnl to make dynamic libraries as well.
+dnl
+AC_DEFUN(PHP_EXTENSION,[
+ EXT_SUBDIRS="$EXT_SUBDIRS $1"
+ _extlib="libphpext_$1.a"
+ EXT_LIBS="$EXT_LIBS $1/$_extlib"
+ EXTINFO_DEPS="$EXTINFO_DEPS ../ext/$1/extinfo.c.stub"
+])
+
+AC_SUBST(EXT_SUBDIRS)
+AC_SUBST(EXT_LIBS)
+AC_SUBST(EXTINFO_DEPS)
diff --git a/aclocal.m4 b/aclocal.m4
index 35afb96995..c8c6ef02ef 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,3 +1,15 @@
+dnl aclocal.m4 generated automatically by aclocal 1.3
+
+dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+dnl This Makefile.in is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
dnl $Id$
dnl
dnl This file contains local autoconf functions.
@@ -227,28 +239,6 @@ main() {
])
])
-## libtool.m4 - Configure libtool for the target system. -*-Shell-script-*-
-## Copyright (C) 1996, 1997 Free Software Foundation, Inc.
-## Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-##
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 2 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful, but
-## WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-## General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, write to the Free Software
-## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-##
-## As a special exception to the GNU General Public License, if you
-## distribute this file as part of a program that contains a
-## configuration script generated by Autoconf, you may include it under
-## the same distribution terms that you use for the rest of that program.
# serial 9 AM_PROG_LIBTOOL
AC_DEFUN(AM_PROG_LIBTOOL,
@@ -415,3 +405,101 @@ Check your system clock])
fi
rm -f conftest*
AC_MSG_RESULT(yes)])
+
+dnl
+dnl Stuff to do when setting up a new extension.
+dnl XXX have to change the hardcoding of ".a" when we want to be able
+dnl to make dynamic libraries as well.
+dnl
+AC_DEFUN(PHP_EXTENSION,[
+ EXT_SUBDIRS="$EXT_SUBDIRS $1"
+ _extlib="libphpext_$1.a"
+ EXT_LIBS="$EXT_LIBS $1/$_extlib"
+ EXTINFO_DEPS="$EXTINFO_DEPS ../ext/$1/extinfo.c.stub"
+])
+
+AC_SUBST(EXT_SUBDIRS)
+AC_SUBST(EXT_LIBS)
+AC_SUBST(EXTINFO_DEPS)
+
+# Do all the work for Automake. This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN(AM_INIT_AUTOMAKE,
+[AC_REQUIRE([AM_PROG_INSTALL])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION"))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+
+# serial 1
+
+AC_DEFUN(AM_PROG_INSTALL,
+[AC_REQUIRE([AC_PROG_INSTALL])
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+AC_SUBST(INSTALL_SCRIPT)dnl
+])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN(AM_MISSING_PROG,
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+ $1=$2
+ AC_MSG_RESULT(found)
+else
+ $1="$3/missing $2"
+ AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file.
+
+AC_DEFUN(AM_CONFIG_HEADER,
+[AC_PREREQ([2.12])
+AC_CONFIG_HEADER([$1])
+dnl When config.status generates a header, we must update the stamp-h file.
+dnl This file resides in the same directory as the config header
+dnl that is generated. We must strip everything past the first ":",
+dnl and everything past the last "/".
+AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
+ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
+<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
+<<am_indx=1
+for am_file in <<$1>>; do
+ case " <<$>>CONFIG_HEADERS " in
+ *" <<$>>am_file "*<<)>>
+ echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
+ ;;
+ esac
+ am_indx=`expr "<<$>>am_indx" + 1`
+done<<>>dnl>>)
+changequote([,]))])
+
diff --git a/configure.in b/configure.in
index 5b44d9d7ac..c5f36238e4 100644
--- a/configure.in
+++ b/configure.in
@@ -1,13 +1,51 @@
-dnl $Id$
+dnl $Id$ -*- sh -*-
dnl Process this file with autoconf to produce a configure script.
-AC_INIT(main.c)
+divert(0)
+recurse=yes
+for arg in $@; do
+ case $arg in
+ --no-recursion) recurse=no;;
+ *) ;;
+ esac
+done
+
+if test "$recurse" = "yes"; then
+ (cwd=`pwd`;set -x;cd libzend;./configure --cache-file=$cwd/config.cache $@)
+fi
+
+dnl ## Diversion 1 is the initial checking of OS features, programs,
+dnl ## libraries and so on.
+
+dnl ## In diversion 2 we check for compile-time options to the PHP
+dnl ## core and how to deal with different system dependencies. This
+dnl ## includes what regex library is used and whether debugging or short
+dnl ## tags are enabled, and the default behaviour of php3.ini options.
+dnl ## This is also where an SAPI interface is selected (choosing between
+dnl ## Apache module, CGI etc.)
+
+dnl ## In diversion 3 we check which extensions should be compiled.
+dnl ## All of these are normally in the extension directories.
-PHP_VERSION=`cut -d\" -f 2 $srcdir/php_version.h`
+dnl ## Diversion 4 is the last one. Here we generate files and clean up.
+
+divert(1)
+
+AC_INIT(main.c)
+dnl ## This is where the version number is changed from now on!
+AM_INIT_AUTOMAKE(php, 4.0pa1)
+
+PHP_VERSION=$VERSION
+echo "#define PHP_VERSION \"$PHP_VERSION\"" > php_version.h.new
+if ! cmp php_version.h.new php_version.h >/dev/null; then
+ rm -f php_version.h && mv php_version.h.new php_version.h && \
+ echo 'Updated php_version.h'
+else
+ rm -f php_version.h.new
+fi
AC_SUBST(PHP_VERSION)
-AC_CONFIG_HEADER(config.h)
-AM_SANITY_CHECK
+AM_CONFIG_HEADER(config.h)
AM_MAINTAINER_MODE
dnl We want this one before the checks, so the checks can modify CFLAGS.
@@ -16,16 +54,21 @@ test -z "$CFLAGS" && auto_cflags=1
dnl Checks for programs.
AC_PROG_YACC
if test "$YACC" != "bison -y"; then
- AC_MSG_WARN(You will need bison if you'd want to regenerate the PHP 3.0 parsers.)
+ AC_MSG_WARN(You will need bison if you want to regenerate the PHP parsers.)
else
AC_MSG_CHECKING(bison version)
- set `bison --version| sed -e 's/^GNU Bison version //' -e 's/\./ /'`
+ set `$YACC --version| sed -e 's/^GNU Bison version //' -e 's/\./ /'`
if test "$1" = "1" -a "$2" -lt "25"; then
- AC_MSG_WARN(You will need bison 1.25 if you'd want to regenerate the PHP 3.0 parsers (found $1.$2).)
+ AC_MSG_WARN(You will need bison 1.25 if you want to regenerate the PHP parsers (found $1.$2).)
fi
AC_MSG_RESULT($1.$2 (ok))
fi
+
+dnl ## there has to be a better way...
+dnl## OLDLIBS=$LIBS; LIBS=""
AC_PROG_CC
+dnl## LIBS=$OLDLIBS
+
AC_PROG_RANLIB
AC_PROG_CC_C_O
AC_PATH_PROG(PERL_PATH, perl)
@@ -98,6 +141,9 @@ if test -d /usr/pkg/include -a -d /usr/pkg/lib ; then
LDFLAGS="$LDFLAGS -L/usr/pkg/lib"
fi
+INCLUDES=""
+AC_SUBST(INCLUDES)
+
AC_PREFERRED_DB_LIB
AC_CHECK_LIB(nsl, gethostname, [
@@ -164,7 +210,7 @@ if test "$DBM_LIB" = "-lgdbm"; then
AC_CHECK_HEADER(/usr/local/include/gdbm.h, [ GDBM_INCLUDE="-I/usr/local/include" ],[
AC_MSG_RESULT("Try /opt/local/include/gdbm.h");
AC_CHECK_HEADER(/opt/local/include/gdbm.h, [ GDBM_INCLUDE="-I/opt/local/include" ],[
- dnl if in /usr/pkg/include, don't add anything. See above.
+ dnl if in /usr/pkg/include, do not add anything. See above.
AC_MSG_RESULT("Try /usr/pkg/include/gdbm.h");
AC_CHECK_HEADER(/usr/pkg/include/gdbm.h, [ GDBM_INCLUDE="" ],[
AC_MSG_RESULT("Giving up - You need to install gdbm.h somewhere");
@@ -173,7 +219,8 @@ if test "$DBM_LIB" = "-lgdbm"; then
])
])
])
- AC_SUBST(GDBM_INCLUDE)
+ INCLUDES="$INCLUDES $GDBM_INCLUDES"
+dnl## AC_SUBST(GDBM_INCLUDE)
fi
dnl Checks for typedefs, structures, and compiler characteristics.
@@ -205,7 +252,9 @@ AC_FUNC_VPRINTF
AC_CHECK_FUNCS(memcpy memmove strdup strerror strcasecmp strstr flock lockf putenv tempnam usleep setlocale gettimeofday setvbuf srand48 lrand48 srandom random link symlink regcomp getlogin cuserid vsnprintf snprintf gcvt utime crypt rint unsetenv strftime setsockopt tzset)
AC_FUNC_UTIME_NULL
AC_FUNC_ALLOCA
+dnl## OLDLIBS=$LIBS; LIBS=""
AC_BROKEN_SPRINTF
+dnl## LIBS=$OLDLIBS
AC_REPLACE_FUNCS(getopt)
dnl AIX keeps in_addr_t in /usr/include/netinet/in.h
@@ -230,6 +279,8 @@ fi
AC_CRYPT_CAP
+divert(2)
+
AC_MSG_CHECKING(whether to use bundled regex library)
AC_ARG_WITH(system-regex,
[ --with-system-regex Do not use the bundled regex library],
@@ -328,7 +379,8 @@ AC_ARG_WITH(shared-apache,
AC_MSG_ERROR(Invalid Apache directory - unable to find httpd.h under $withval/src/include)
fi
fi
- AC_SUBST(APACHE_INCLUDE)
+ INCLUDES="$INCLUDES $APACHE_INCLUDE"
+dnl## AC_SUBST(APACHE_INCLUDE)
AC_SUBST(APACHE_TARGET)
AC_SUBST(INSTALL_IT)
AC_SUBST(BINNAME)
@@ -473,7 +525,8 @@ AC_ARG_WITH(apache,
BINNAME=php
INSTALL_IT="cp $BINNAME \$(bindir)"
])
-AC_SUBST(APACHE_INCLUDE)
+INCLUDES="$INCLUDES $APACHE_INCLUDE"
+dnl## AC_SUBST(APACHE_INCLUDE)
AC_SUBST(APACHE_TARGET)
AC_SUBST(INSTALL_IT)
AC_SUBST(BINNAME)
@@ -520,13 +573,280 @@ AC_ARG_WITH(fhttpd,
],[
AC_MSG_RESULT(no)
])
-AC_SUBST(FHTTPD_INCLUDE)
+INCLUDES="$INCLUDES $FHTTPD_INCLUDE"
+dnl## AC_SUBST(FHTTPD_INCLUDE)
AC_SUBST(FHTTPD_LIB)
AC_SUBST(FHTTPD_TARGET)
+
+AC_MSG_CHECKING(whether to use a configuration file)
+AC_ARG_WITH(config-file-path,
+[ --with-config-file-path=PATH Sets the path in which to look for php3.ini
+ defaults to /usr/local/lib],
+[
+ if test "$withval" = "yes"; then
+ AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "/usr/local/lib")
+ AC_DEFINE(USE_CONFIG_FILE, 1)
+ AC_MSG_RESULT(yes)
+ else
+ if test "$withval" != "no"; then
+ AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "$withval")
+ AC_DEFINE(USE_CONFIG_FILE, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(CONFIGURATION_FILE_PATH, 0)
+ AC_DEFINE(USE_CONFIG_FILE, 0)
+ AC_MSG_RESULT(no)
+ fi
+ fi
+],[
+ AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "/usr/local/lib")
+ AC_DEFINE(USE_CONFIG_FILE, 1)
+ AC_MSG_RESULT(yes)
+])
+
+
+AC_MSG_CHECKING(whether to include debugging symbols)
+AC_ARG_ENABLE(debug,
+[ --enable-debug Compile with debugging symbols],
+[
+ if test "$enableval" = "yes"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(DEBUG,1)
+ PHP_DEBUG=1
+ DEBUG_CFLAGS="-g"
+ test -n "$GCC" && DEBUG_CFLAGS="$DEBUG_CFLAGS -Wall"
+ test -n "$GCC" && test "$USE_MAINTAINER_MODE" = "yes" && \
+ DEBUG_CFLAGS="$DEBUG_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations"
+ else
+ AC_MSG_RESULT(no)
+ AC_DEFINE(DEBUG,0)
+ PHP_DEBUG=0
+ DEBUG_CFLAGS=""
+ fi
+],[
+ AC_MSG_RESULT(no)
+ AC_DEFINE(DEBUG,0)
+ PHP_DEBUG=0
+ DEBUG_CFLAGS=""
+])
+AC_SUBST(DEBUG_CFLAGS)
+AC_SUBST(PHP_DEBUG)
+
+
+AC_MSG_CHECKING(whether to enable safe mode by default)
+AC_ARG_ENABLE(safe-mode,
+[ --enable-safe-mode Enable safe mode by default.],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(PHP_SAFE_MODE, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(PHP_SAFE_MODE, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(PHP_SAFE_MODE, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+AC_MSG_CHECKING(for safe mode exec dir)
+AC_ARG_WITH(exec-dir,
+[ --with-exec-dir[=DIR] Only allow executables in DIR when in safe mode
+ defaults to /usr/local/php/bin],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ AC_DEFINE(PHP_SAFE_MODE_EXEC_DIR,"/usr/local/php/bin")
+ AC_MSG_RESULT(/usr/local/php/bin)
+ else
+ AC_DEFINE_UNQUOTED(PHP_SAFE_MODE_EXEC_DIR,"$withval")
+ AC_MSG_RESULT($withval)
+ fi
+ else
+ AC_DEFINE(PHP_SAFE_MODE_EXEC_DIR,"/usr/local/php/bin")
+ AC_MSG_RESULT(/usr/local/php/bin)
+ fi
+],[
+ AC_DEFINE(PHP_SAFE_MODE_EXEC_DIR,"/usr/local/php/bin")
+ AC_MSG_RESULT(/usr/local/php/bin)
+])
+
+
+AC_MSG_CHECKING(whether to enable track_vars variables by default)
+AC_ARG_ENABLE(track-vars,
+[ --enable-track-vars Enable GET/POST/Cookie track variables by default.],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(PHP_TRACK_VARS, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(PHP_TRACK_VARS, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(PHP_TRACK_VARS, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+AC_MSG_CHECKING(whether to enable magic quotes by default)
+AC_ARG_ENABLE(magic-quotes,
+[ --enable-magic-quotes Enable magic quotes by default.],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(MAGIC_QUOTES, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(MAGIC_QUOTES, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(MAGIC_QUOTES, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+dnl AC_MSG_CHECKING(whether to enable PHP RPC support)
+dnl AC_ARG_ENABLE(php-rpc,
+dnl [ --enable-php-rpc Compile with PHP RPC support.],
+dnl [
+dnl if test "$enableval" = "yes"; then
+dnl AC_DEFINE(PHP_RPC, 1)
+dnl AC_MSG_RESULT(yes)
+dnl else
+dnl AC_DEFINE(PHP_RPC, 0)
+dnl AC_MSG_RESULT(no)
+dnl fi
+dnl ],[
+dnl AC_DEFINE(PHP_RPC, 0)
+dnl AC_MSG_RESULT(no)
+dnl ])
+
+AC_MSG_CHECKING(whether to enable bc style precision math functions)
+AC_ARG_ENABLE(bcmath,
+[ --disable-bcmath Compile without bc style precision math functions. ],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(WITH_BCMATH, 1)
+ AC_MSG_RESULT(yes)
+ BCMATH_SRC="functions/bcmath.c functions/number.c"
+ else
+ AC_DEFINE(WITH_BCMATH, 0)
+ AC_MSG_RESULT(no)
+ BCMATH_SRC=""
+ fi
+],[
+ AC_DEFINE(WITH_BCMATH, 1)
+ AC_MSG_RESULT(yes)
+ BCMATH_SRC="functions/bcmath.c functions/number.c"
+])
+AC_SUBST(BCMATH_SRC)
+
+if test "$BINNAME" = "php"; then
+AC_MSG_CHECKING(whether to force Apache CGI redirect)
+AC_ARG_ENABLE(force-cgi-redirect,
+[ --enable-force-cgi-redirect Enable the security check for internal server
+ redirects. You should use this if you are
+ running the CGI version with Apache. ],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(FORCE_CGI_REDIRECT, 1)
+ AC_MSG_RESULT(yes)
+ REDIRECT=1
+ else
+ AC_DEFINE(FORCE_CGI_REDIRECT, 0)
+ AC_MSG_RESULT(no)
+ REDIRECT=0
+ fi
+],[
+ AC_DEFINE(FORCE_CGI_REDIRECT, 0)
+ AC_MSG_RESULT(no)
+ REDIRECT=0
+])
+
+AC_MSG_CHECKING(whether to discard path_info + path_translated)
+AC_ARG_ENABLE(discard_path,
+[ --enable-discard-path If this is enabled, the PHP CGI binary
+ can safely be placed outside of the
+ web tree and people will not be able
+ to circumvent .htaccess security. ],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(DISCARD_PATH, 1)
+ AC_MSG_RESULT(yes)
+ DISCARD_PATH=1
+ else
+ AC_DEFINE(DISCARD_PATH, 0)
+ AC_MSG_RESULT(no)
+ DISCARD_PATH=0
+ fi
+],[
+ AC_DEFINE(DISCARD_PATH, 0)
+ AC_MSG_RESULT(no)
+ DISCARD_PATH=0
+])
+fi
+
+AC_MSG_CHECKING(whether to enable a memory limit)
+AC_ARG_ENABLE(memory-limit,
+[ --enable-memory-limit Compile with memory limit support. ],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(MEMORY_LIMIT, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(MEMORY_LIMIT, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(MEMORY_LIMIT, 0)
+ AC_MSG_RESULT(no)
+])
+
+AC_MSG_CHECKING(whether to enable short tags by default)
+AC_ARG_ENABLE(short-tags,
+[ --disable-short-tags Disable the short-form <? start tag by default.],
+[
+ if test "$enableval" = "no"; then
+ AC_DEFINE(DEFAULT_SHORT_OPEN_TAG, 0)
+ AC_MSG_RESULT(no)
+ else
+ AC_DEFINE(DEFAULT_SHORT_OPEN_TAG, 1)
+ AC_MSG_RESULT(yes)
+ fi
+],[
+ AC_DEFINE(DEFAULT_SHORT_OPEN_TAG, 1)
+ AC_MSG_RESULT(yes)
+])
+
+AC_MSG_CHECKING(whether to enable the URL-aware fopen wrapper)
+AC_ARG_ENABLE(url-fopen-wrapper,
+[ --disable-url-fopen-wrapper Disable the URL-aware fopen wrapper that allows
+ accessing files via http or ftp.],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(PHP3_URL_FOPEN, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(PHP3_URL_FOPEN, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(PHP3_URL_FOPEN, 1)
+ AC_MSG_RESULT(yes)
+])
+
+
+divert(3)
+
+# reading config stubs
+esyscmd(./scripts/config-stubs)
+
AC_MSG_CHECKING(for IMAP support)
AC_ARG_WITH(imap,
-[ --with-imap[=DIR] Include IMAP support (DIR is IMAP's include dir and c-client.a dir).],
+[ --with-imap[=DIR] Include IMAP support (DIR is the IMAP include dir and c-client.a dir).],
[
if test "$withval" != "no"; then
if test "$withval" = "yes"; then
@@ -546,73 +866,21 @@ AC_ARG_WITH(imap,
if test ! -f $IMAP_DIR/lib/c-client.a; then
AC_MSG_ERROR(could not find c-client.a in $IMAP_DIR/lib !)
fi
- IMAP_INCLUDE="-I$IMAP_DIR/include/"
- IMAP_LIBS="$IMAP_DIR/lib/c-client.a"
- AC_SUBST(IMAP_INCLUDE)
- AC_SUBST(IMAP_LIBS)
- AC_DEFINE(HAVE_IMAP)
- AC_MSG_RESULT(yes)
- else
- AC_MSG_ERROR(could not find imap library!)
- fi
+ IMAP_INCLUDE="-I$IMAP_DIR/include/"
+ IMAP_LIBS="$IMAP_DIR/lib/c-client.a"
+
+dnl## AC_SUBST(IMAP_INCLUDE)
+ INCLUDES="$INCLUDES $IMAP_INCLUDE"
+ AC_SUBST(IMAP_LIBS)
+ LIBS="$LIBS $IMAP_LIBS"
+ AC_DEFINE(HAVE_IMAP)
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_ERROR(could not find imap library!)
+ fi
],[
AC_MSG_RESULT(no)
])
-
-AC_MSG_CHECKING(whether to include GD support)
-AC_ARG_WITH(gd,
-[ --without-gd Disable GD support.
- --with-gd[=DIR] Include GD support (DIR is GD's install dir).],
-[
- case "$withval" in
- no)
- AC_MSG_RESULT(no) ;;
- yes)
- GD_LIBS="-lgd"
- AC_DEFINE(HAVE_LIBGD)
- AC_MSG_RESULT(yes)
- AC_CHECK_LIB(gd, gdImageString16, [ AC_DEFINE(HAVE_LIBGD13) ])
- ac_cv_lib_gd_gdImageLine=yes
- ;;
- *)
-dnl A whole whack of possible places where this might be
- test -f $withval/include/gd1.3/gd.h && GD_INCLUDE="-I$withval/include/gd1.3"
- test -f $withval/include/gd/gd.h && GD_INCLUDE="-I$withval/include/gd"
- test -f $withval/include/gd.h && GD_INCLUDE="-I$withval/include"
- test -f $withval/gd1.3/gd.h && GD_INCLUDE="-I$withval/gd1.3"
- test -f $withval/gd/gd.h && GD_INCLUDE="-I$withval/gd"
- test -f $withval/gd.h && GD_INCLUDE="-I$withval"
-
- test -f $withval/lib/libgd.a && GD_LIB="$withval/lib"
- test -f $withval/lib/gd/libgd.a && GD_LIB="$withval/lib/gd"
- test -f $withval/lib/gd1.3/libgd.a && GD_LIB="$withval/lib/gd1.3"
- test -f $withval/libgd.a && GD_LIB="$withval"
- test -f $withval/gd/libgd.a && GD_LIB="$withval/gd"
- test -f $withval/gd1.3/libgd.a && GD_LIB="$withval/gd1.3"
-
- if test -n "$GD_INCLUDE" && test -n "$GD_LIB" ; then
- GD_LIBS="-L$GD_LIB -lgd"
- AC_DEFINE(HAVE_LIBGD)
- AC_MSG_RESULT(yes)
- AC_CHECK_LIB(gd, gdImageString16, [ AC_DEFINE(HAVE_LIBGD13) ])
- ac_cv_lib_gd_gdImageLine=yes
- else
- AC_MSG_RESULT(no)
- fi ;;
- esac
-],[
- AC_CHECK_LIB(gd, gdImageLine)
- AC_CHECK_LIB(gd, gdImageString16, [ AC_DEFINE(HAVE_LIBGD13) ])
-])
-AC_SUBST(GD_LIBS)
-if test -f /usr/pkg/include/gd/gd.h -a -z "$GD_INCLUDE" ; then
- GD_INCLUDE="-I/usr/pkg/include/gd"
-fi
-AC_SUBST(GD_INCLUDE)
-if test "$ac_cv_lib_gd_gdImageLine" = "yes"; then
- AC_CHECK_LIB(ttf, TT_Open_Face)
-fi
-
AC_MSG_CHECKING(for Oracle support)
@@ -761,7 +1029,8 @@ AC_SUBST(ORACLE_SHLIBS)
AC_SUBST(ORACLE_STLIBS)
AC_SUBST(ORACLE_LIBS)
AC_SUBST(ORACLE_LFLAGS)
-AC_SUBST(ORACLE_INCLUDE)
+dnl## AC_SUBST(ORACLE_INCLUDE)
+INCLUDES="$INCLUDES $ORACLE_INCLUDE"
AC_SUBST(ORACLE_HOME)
AC_SUBST(ORACLE_VERSION)
@@ -793,7 +1062,8 @@ AC_ARG_WITH(iodbc,
])
AC_SUBST(IODBC_LIBS)
AC_SUBST(IODBC_LFLAGS)
-AC_SUBST(IODBC_INCLUDE)
+dnl## AC_SUBST(IODBC_INCLUDE)
+INCLUDES="$INCLUDES $IODBC_INCLUDE"
AC_MSG_CHECKING(for OpenLink ODBC support)
@@ -824,7 +1094,8 @@ AC_ARG_WITH(openlink,
])
AC_SUBST(OPENLINK_LIBS)
AC_SUBST(OPENLINK_LFLAGS)
-AC_SUBST(OPENLINK_INCLUDE)
+dnl## AC_SUBST(OPENLINK_INCLUDE)
+INCLUDES="$INCLUDES $OPENLINK_INCLUDE"
AC_MSG_CHECKING(for Adabas support)
@@ -853,7 +1124,8 @@ AC_ARG_WITH(adabas,
])
AC_SUBST(ADA_LIBS)
AC_SUBST(ADA_LFLAGS)
-AC_SUBST(ADA_INCLUDE)
+dnl## AC_SUBST(ADA_INCLUDE)
+INCLUDES="$INCLUDES $ADA_INCLUDE"
AC_MSG_CHECKING(for Sybase support)
@@ -886,7 +1158,8 @@ AC_ARG_WITH(sybase,
])
AC_SUBST(SYBASE_LIBS)
AC_SUBST(SYBASE_LFLAGS)
-AC_SUBST(SYBASE_INCLUDE)
+dnl## AC_SUBST(SYBASE_INCLUDE)
+INCLUDES="$INCLUDES $SYBASE_INCLUDE"
AC_MSG_CHECKING(for Sybase-CT support)
AC_ARG_WITH(sybase-ct,
@@ -923,7 +1196,8 @@ AC_ARG_WITH(sybase-ct,
])
AC_SUBST(SYBASE_CT_LIBS)
AC_SUBST(SYBASE_CT_LFLAGS)
-AC_SUBST(SYBASE_CT_INCLUDE)
+dnl## AC_SUBST(SYBASE_CT_INCLUDE)
+INCLUDES="$INCLUDES $SYBASE_CT_INCLUDE"
AC_MSG_CHECKING(for MySQL support)
@@ -973,7 +1247,8 @@ dnl Why are we defining HAVE_MYSQL here??
])
AC_SUBST(MYSQL_LIBS)
AC_SUBST(MYSQL_LFLAGS)
-AC_SUBST(MYSQL_INCLUDE)
+dnl## AC_SUBST(MYSQL_INCLUDE)
+INCLUDES="$INCLUDES $MYSQL_INCLUDE"
AC_MSG_CHECKING(for mSQL support)
@@ -1004,7 +1279,8 @@ AC_ARG_WITH(msql,
])
AC_SUBST(MSQL_LIBS)
AC_SUBST(MSQL_LFLAGS)
-AC_SUBST(MSQL_INCLUDE)
+dnl## AC_SUBST(MSQL_INCLUDE)
+INCLUDES="$INCLUDES $MSQL_INCLUDE"
AC_MSG_CHECKING(for PostgresSQL support)
AC_ARG_WITH(pgsql,
@@ -1041,7 +1317,8 @@ AC_ARG_WITH(pgsql,
])
AC_SUBST(PGSQL_LIBS)
AC_SUBST(PGSQL_LFLAGS)
-AC_SUBST(PGSQL_INCLUDE)
+dnl## AC_SUBST(PGSQL_INCLUDE)
+INCLUDES="$INCLUDES $PGSQL_INCLUDE"
AC_MSG_CHECKING(for Solid support)
@@ -1072,8 +1349,9 @@ AC_ARG_WITH(solid,
if test "$SOLID_LIBDIR" != ""; then
AC_FIND_SOLID_LIBS($SOLID_LIBDIR)
fi
-AC_SUBST(SOLID_INCLUDE)
+dnl## AC_SUBST(SOLID_INCLUDE)
AC_SUBST(SOLID_LIBS)
+INCLUDES="$INCLUDES $SOLID_INCLUDE"
AC_MSG_CHECKING(for Empress support)
@@ -1104,8 +1382,9 @@ AC_ARG_WITH(empress,
if test "$EMPRESS_LIBDIR" != ""; then
AC_FIND_EMPRESS_LIBS($EMPRESS_LIBDIR)
fi
-AC_SUBST(EMPRESS_INCLUDE)
AC_SUBST(EMPRESS_LIBS)
+dnl## AC_SUBST(EMPRESS_INCLUDE)
+INCLUDES="$INCLUDES $EMPRESS_INCLUDE"
AC_MSG_CHECKING(for LDAP support)
@@ -1136,7 +1415,9 @@ AC_ARG_WITH(ldap,
])
AC_SUBST(LDAP_LIBS)
AC_SUBST(LDAP_LFLAGS)
-AC_SUBST(LDAP_INCLUDE)
+dnl## AC_SUBST(LDAP_INCLUDE)
+INCLUDES="$INCLUDES $LDAP_INCLUDE"
+
AC_MSG_CHECKING(for SNMP support)
AC_ARG_WITH(snmp,
@@ -1168,7 +1449,9 @@ AC_ARG_WITH(snmp,
])
AC_SUBST(SNMP_LIBS)
AC_SUBST(SNMP_LFLAGS)
-AC_SUBST(SNMP_INCLUDE)
+dnl## AC_SUBST(SNMP_INCLUDE)
+INCLUDES="$INCLUDES $SNMP_INCLUDE"
+
AC_MSG_CHECKING(for Velocis support)
AC_ARG_WITH(velocis,
@@ -1208,7 +1491,9 @@ AC_ARG_WITH(velocis,
])
AC_SUBST(VELOCIS_LIBS)
AC_SUBST(VELOCIS_LFLAGS)
-AC_SUBST(VELOCIS_INCLUDE)
+dnl## AC_SUBST(VELOCIS_INCLUDE)
+INCLUDES="$INCLUDES $VELOCIS_INCLUDE"
+
AC_MSG_CHECKING(for Informix support)
AC_ARG_WITH(informix,
@@ -1244,7 +1529,7 @@ WARNING: You specified Informix base install directory that is different
dnl -lm twice otherwise?
IFX_LIBS=`echo $IFX_LIBS | sed -e 's/Libraries to be used://g' -e 's/esql: error -55923: No source or object file\.//g'`
dnl Seems to get rid of newlines.
- dnl According to Perl's DBD-Informix, might contain these strings.
+ dnl According to Perls DBD-Informix, might contain these strings.
else
dnl Allow override to use static and/or threaded libs
IFX_LIBS="$IFX_LIBS"
@@ -1277,8 +1562,10 @@ WARNING: You specified Informix base install directory that is different
])
AC_SUBST(IFX_LIBS)
AC_SUBST(IFX_LFLAGS)
-AC_SUBST(IFX_INCLUDE)
AC_SUBST(INFORMIXDIR)
+dnl## AC_SUBST(IFX_INCLUDE)
+INCLUDES="$INCLUDES $IFX_INCLUDE"
+
AC_MSG_CHECKING(for InterBase support)
AC_ARG_WITH(interbase,
@@ -1306,9 +1593,11 @@ AC_ARG_WITH(interbase,
],[
AC_MSG_RESULT(no)
])
-AC_SUBST(IBASE_INCLUDE)
AC_SUBST(IBASE_LIBS)
AC_SUBST(IBASE_LFLAGS)
+dnl## AC_SUBST(IBASE_INCLUDE)
+INCLUDES="$INCLUDES $IBASE_INCLUDE"
+
AC_MSG_CHECKING(for a custom ODBC support)
AC_ARG_WITH(custom-odbc,
@@ -1346,7 +1635,8 @@ AC_ARG_WITH(custom-odbc,
])
AC_SUBST(CODBC_LIBS)
AC_SUBST(CODBC_LFLAGS)
-AC_SUBST(CODBC_INCLUDE)
+dnl## AC_SUBST(CODBC_INCLUDE)
+INCLUDES="$INCLUDES $CODBC_INCLUDE"
AC_MSG_CHECKING(for Hyperwave support)
@@ -1413,7 +1703,8 @@ AC_ARG_WITH(zlib,
AC_MSG_RESULT(no)
])
AC_SUBST(ZLIB_LIBS)
-AC_SUBST(ZLIB_INCLUDE)
+dnl## AC_SUBST(ZLIB_INCLUDE)
+INCLUDES="$INCLUDES $ZLIB_INCLUDE"
AC_MSG_CHECKING(whether to include pdflib support)
@@ -1446,7 +1737,8 @@ AC_ARG_WITH(pdflib,
AC_MSG_RESULT(no)
])
AC_SUBST(PDFLIB_LIBS)
-AC_SUBST(PDFLIB_INCLUDE)
+dnl## AC_SUBST(PDFLIB_INCLUDE)
+INCLUDES="$INCLUDES $PDFLIB_INCLUDE"
AC_MSG_CHECKING(whether to include fdftk support)
@@ -1479,7 +1771,8 @@ AC_ARG_WITH(fdftk,
AC_MSG_RESULT(no)
])
AC_SUBST(FDFLIB_LIBS)
-AC_SUBST(FDFLIB_INCLUDE)
+dnl## AC_SUBST(FDFLIB_INCLUDE)
+INCLUDES="$INCLUDES $FDFLIB_INCLUDE"
AC_MSG_CHECKING(whether to include the bundled dbase library)
@@ -1532,7 +1825,7 @@ AC_ARG_WITH(mod-dav,
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_MOD_DAV, 1)
MOD_DAV_CFLAGS="-DHAVE_MOD_DAV -I$withval"
- APACHE_INCLUDE="$APACHE_INCLUDE -I$withval"
+ INCLUDES="$INCLUDES -I$withval"
else
AC_MSG_RESULT(no)
AC_DEFINE(HAVE_MOD_DAV, 0)
@@ -1544,6 +1837,7 @@ AC_ARG_WITH(mod-dav,
])
AC_SUBST(MOD_DAV_CFLAGS)
+
AC_MSG_CHECKING(whether to enable unified ODBC support)
AC_ARG_ENABLE(unified-odbc,
[ --disable-unified-odbc Disable unified ODBC support. Only applicable if
@@ -1581,270 +1875,6 @@ AC_ARG_ENABLE(unified-odbc,
])
-
-
-
-
-
-AC_MSG_CHECKING(whether to use a configuration file)
-AC_ARG_WITH(config-file-path,
-[ --with-config-file-path=PATH Sets the path in which to look for php3.ini
- defaults to /usr/local/lib],
-[
- if test "$withval" = "yes"; then
- AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "/usr/local/lib")
- AC_DEFINE(USE_CONFIG_FILE, 1)
- AC_MSG_RESULT(yes)
- else
- if test "$withval" != "no"; then
- AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "$withval")
- AC_DEFINE(USE_CONFIG_FILE, 1)
- AC_MSG_RESULT(yes)
- else
- AC_DEFINE(CONFIGURATION_FILE_PATH, 0)
- AC_DEFINE(USE_CONFIG_FILE, 0)
- AC_MSG_RESULT(no)
- fi
- fi
-],[
- AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "/usr/local/lib")
- AC_DEFINE(USE_CONFIG_FILE, 1)
- AC_MSG_RESULT(yes)
-])
-
-
-AC_MSG_CHECKING(whether to include debugging symbols)
-AC_ARG_ENABLE(debug,
-[ --enable-debug Compile with debugging symbols],
-[
- if test "$enableval" = "yes"; then
- AC_MSG_RESULT(yes)
- AC_DEFINE(DEBUG,1)
- PHP_DEBUG=1
- DEBUG_CFLAGS="-g"
- test -n "$GCC" && DEBUG_CFLAGS="$DEBUG_CFLAGS -Wall"
- test -n "$GCC" && test "$USE_MAINTAINER_MODE" = "yes" && \
- DEBUG_CFLAGS="$DEBUG_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations"
- else
- AC_MSG_RESULT(no)
- AC_DEFINE(DEBUG,0)
- PHP_DEBUG=0
- DEBUG_CFLAGS=""
- fi
-],[
- AC_MSG_RESULT(no)
- AC_DEFINE(DEBUG,0)
- PHP_DEBUG=0
- DEBUG_CFLAGS=""
-])
-AC_SUBST(DEBUG_CFLAGS)
-AC_SUBST(PHP_DEBUG)
-
-
-AC_MSG_CHECKING(whether to enable safe mode by default)
-AC_ARG_ENABLE(safe-mode,
-[ --enable-safe-mode Enable safe mode by default.],
-[
- if test "$enableval" = "yes"; then
- AC_DEFINE(PHP_SAFE_MODE, 1)
- AC_MSG_RESULT(yes)
- else
- AC_DEFINE(PHP_SAFE_MODE, 0)
- AC_MSG_RESULT(no)
- fi
-],[
- AC_DEFINE(PHP_SAFE_MODE, 0)
- AC_MSG_RESULT(no)
-])
-
-
-AC_MSG_CHECKING(for safe mode exec dir)
-AC_ARG_WITH(exec-dir,
-[ --with-exec-dir[=DIR] Only allow executables in DIR when in safe mode
- defaults to /usr/local/php/bin],
-[
- if test "$withval" != "no"; then
- if test "$withval" = "yes"; then
- AC_DEFINE(PHP_SAFE_MODE_EXEC_DIR,"/usr/local/php/bin")
- AC_MSG_RESULT(/usr/local/php/bin)
- else
- AC_DEFINE_UNQUOTED(PHP_SAFE_MODE_EXEC_DIR,"$withval")
- AC_MSG_RESULT($withval)
- fi
- else
- AC_DEFINE(PHP_SAFE_MODE_EXEC_DIR,"/usr/local/php/bin")
- AC_MSG_RESULT(/usr/local/php/bin)
- fi
-],[
- AC_DEFINE(PHP_SAFE_MODE_EXEC_DIR,"/usr/local/php/bin")
- AC_MSG_RESULT(/usr/local/php/bin)
-])
-
-
-AC_MSG_CHECKING(whether to enable track_vars variables by default)
-AC_ARG_ENABLE(track-vars,
-[ --enable-track-vars Enable GET/POST/Cookie track variables by default.],
-[
- if test "$enableval" = "yes"; then
- AC_DEFINE(PHP_TRACK_VARS, 1)
- AC_MSG_RESULT(yes)
- else
- AC_DEFINE(PHP_TRACK_VARS, 0)
- AC_MSG_RESULT(no)
- fi
-],[
- AC_DEFINE(PHP_TRACK_VARS, 0)
- AC_MSG_RESULT(no)
-])
-
-
-AC_MSG_CHECKING(whether to enable magic quotes by default)
-AC_ARG_ENABLE(magic-quotes,
-[ --enable-magic-quotes Enable magic quotes by default.],
-[
- if test "$enableval" = "yes"; then
- AC_DEFINE(MAGIC_QUOTES, 1)
- AC_MSG_RESULT(yes)
- else
- AC_DEFINE(MAGIC_QUOTES, 0)
- AC_MSG_RESULT(no)
- fi
-],[
- AC_DEFINE(MAGIC_QUOTES, 0)
- AC_MSG_RESULT(no)
-])
-
-
-dnl AC_MSG_CHECKING(whether to enable PHP RPC support)
-dnl AC_ARG_ENABLE(php-rpc,
-dnl [ --enable-php-rpc Compile with PHP RPC support.],
-dnl [
-dnl if test "$enableval" = "yes"; then
-dnl AC_DEFINE(PHP_RPC, 1)
-dnl AC_MSG_RESULT(yes)
-dnl else
-dnl AC_DEFINE(PHP_RPC, 0)
-dnl AC_MSG_RESULT(no)
-dnl fi
-dnl ],[
-dnl AC_DEFINE(PHP_RPC, 0)
-dnl AC_MSG_RESULT(no)
-dnl ])
-
-AC_MSG_CHECKING(whether to enable bc style precision math functions)
-AC_ARG_ENABLE(bcmath,
-[ --disable-bcmath Compile without bc style precision math functions. ],
-[
- if test "$enableval" = "yes"; then
- AC_DEFINE(WITH_BCMATH, 1)
- AC_MSG_RESULT(yes)
- BCMATH_SRC="functions/bcmath.c functions/number.c"
- else
- AC_DEFINE(WITH_BCMATH, 0)
- AC_MSG_RESULT(no)
- BCMATH_SRC=""
- fi
-],[
- AC_DEFINE(WITH_BCMATH, 1)
- AC_MSG_RESULT(yes)
- BCMATH_SRC="functions/bcmath.c functions/number.c"
-])
-AC_SUBST(BCMATH_SRC)
-
-if test "$BINNAME" = "php"; then
-AC_MSG_CHECKING(whether to force Apache CGI redirect)
-AC_ARG_ENABLE(force-cgi-redirect,
-[ --enable-force-cgi-redirect Enable the security check for internal server
- redirects. You should use this if you are
- running the CGI version with Apache. ],
-[
- if test "$enableval" = "yes"; then
- AC_DEFINE(FORCE_CGI_REDIRECT, 1)
- AC_MSG_RESULT(yes)
- REDIRECT=1
- else
- AC_DEFINE(FORCE_CGI_REDIRECT, 0)
- AC_MSG_RESULT(no)
- REDIRECT=0
- fi
-],[
- AC_DEFINE(FORCE_CGI_REDIRECT, 0)
- AC_MSG_RESULT(no)
- REDIRECT=0
-])
-
-AC_MSG_CHECKING(whether to discard path_info + path_translated)
-AC_ARG_ENABLE(discard_path,
-[ --enable-discard-path If this is enabled, the PHP CGI binary
- can safely be placed outside of the
- web tree and people will not be able
- to circumvent .htaccess security. ],
-[
- if test "$enableval" = "yes"; then
- AC_DEFINE(DISCARD_PATH, 1)
- AC_MSG_RESULT(yes)
- DISCARD_PATH=1
- else
- AC_DEFINE(DISCARD_PATH, 0)
- AC_MSG_RESULT(no)
- DISCARD_PATH=0
- fi
-],[
- AC_DEFINE(DISCARD_PATH, 0)
- AC_MSG_RESULT(no)
- DISCARD_PATH=0
-])
-fi
-
-AC_MSG_CHECKING(whether to enable a memory limit)
-AC_ARG_ENABLE(memory-limit,
-[ --enable-memory-limit Compile with memory limit support. ],
-[
- if test "$enableval" = "yes"; then
- AC_DEFINE(MEMORY_LIMIT, 1)
- AC_MSG_RESULT(yes)
- else
- AC_DEFINE(MEMORY_LIMIT, 0)
- AC_MSG_RESULT(no)
- fi
-],[
- AC_DEFINE(MEMORY_LIMIT, 0)
- AC_MSG_RESULT(no)
-])
-
-AC_MSG_CHECKING(whether to enable short tags by default)
-AC_ARG_ENABLE(short-tags,
-[ --disable-short-tags Disable the short-form <? start tag by default.],
-[
- if test "$enableval" = "no"; then
- AC_DEFINE(DEFAULT_SHORT_OPEN_TAG, 0)
- AC_MSG_RESULT(no)
- else
- AC_DEFINE(DEFAULT_SHORT_OPEN_TAG, 1)
- AC_MSG_RESULT(yes)
- fi
-],[
- AC_DEFINE(DEFAULT_SHORT_OPEN_TAG, 1)
- AC_MSG_RESULT(yes)
-])
-
-AC_MSG_CHECKING(whether to enable the URL-aware fopen wrapper)
-AC_ARG_ENABLE(url-fopen-wrapper,
-[ --disable-url-fopen-wrapper Disable the URL-aware fopen wrapper that allows
- accessing files via http or ftp.],
-[
- if test "$enableval" = "yes"; then
- AC_DEFINE(PHP3_URL_FOPEN, 1)
- AC_MSG_RESULT(yes)
- else
- AC_DEFINE(PHP3_URL_FOPEN, 0)
- AC_MSG_RESULT(no)
- fi
-],[
- AC_DEFINE(PHP3_URL_FOPEN, 1)
- AC_MSG_RESULT(yes)
-])
-
AC_MSG_CHECKING(whether to enable System V semaphore support)
AC_ARG_ENABLE(sysvsem,
[ --enable-sysvsem Enable System V semaphore support.],
@@ -1896,6 +1926,8 @@ AC_ARG_ENABLE(sysvshm,
])
+divert(4)
+
dnl If we're using gcc and the user hasn't specified CFLAGS, add -O2.
test -n "$auto_cflags" && test -n "$GCC" && CFLAGS="$CFLAGS -O2"
@@ -1907,11 +1939,9 @@ fi
dnl *** Commented out - generates slow code and consumes a lot of
dnl *** resources during compilation - we need to figure out how
dnl *** to supply it only when absolutely necessary
-dnl If we're using gcc add -fpic to make dl() work on some platforms
+dnl If we are using gcc add -fpic to make dl() work on some platforms
dnl test -n "$GCC" && CFLAGS="$CFLAGS -fpic"
-LIBS="${LIBS} -lzend"
-
AC_SUBST(CFLAGS)
AC_SUBST(PROG_SENDMAIL)
AC_SUBST(CFLAGS_SHLIB)
@@ -1931,10 +1961,11 @@ AC_DEFINE_UNQUOTED(PHP_UNAME,"$PHP_UNAME")
PHP_OS=`uname`
AC_DEFINE_UNQUOTED(PHP_OS,"$PHP_OS")
-AC_OUTPUT(Makefile build-defs.h stamp-h libphp3.module
-dnl doc/Makefile doc/version.ent doc/checkdoc extra/gd/bdf2gdfont
- regex/Makefile dbase/Makefile, [
-dnl chmod +x doc/checkdoc extra/gd/bdf2gdfont
+AC_OUTPUT(Makefile build-defs.h libphp3.module
+ scripts/mkextlib ext/Makefile
+ regex/Makefile dbase/Makefile
+ ext/gd/Makefile ext/standard/Makefile, [
+chmod +x scripts/mkextlib
], [
dnl Warn about CGI version with no extra security options.
@@ -1954,6 +1985,9 @@ if test "$INFORMIX_WARNING" != ""; then
echo "$INFORMIX_WARNING"
fi
])
+
+divert
+
# Local Variables:
# tab-width: 4
# End:
diff --git a/configure.in.in b/configure.in.in
new file mode 100644
index 0000000000..bed2ce9431
--- /dev/null
+++ b/configure.in.in
@@ -0,0 +1,1993 @@
+dnl $Id$ -*- sh -*-
+dnl Process this file with autoconf to produce a configure script.
+
+divert(0)
+recurse=yes
+for arg in $@; do
+ case $arg in
+ --no-recursion) recurse=no;;
+ *) ;;
+ esac
+done
+
+if test "$recurse" = "yes"; then
+ (cwd=`pwd`;set -x;cd libzend;./configure --cache-file=$cwd/config.cache $@)
+fi
+
+dnl ## Diversion 1 is the initial checking of OS features, programs,
+dnl ## libraries and so on.
+
+dnl ## In diversion 2 we check for compile-time options to the PHP
+dnl ## core and how to deal with different system dependencies. This
+dnl ## includes what regex library is used and whether debugging or short
+dnl ## tags are enabled, and the default behaviour of php3.ini options.
+dnl ## This is also where an SAPI interface is selected (choosing between
+dnl ## Apache module, CGI etc.)
+
+dnl ## In diversion 3 we check which extensions should be compiled.
+dnl ## All of these are normally in the extension directories.
+
+dnl ## Diversion 4 is the last one. Here we generate files and clean up.
+
+divert(1)
+
+AC_INIT(main.c)
+dnl ## This is where the version number is changed from now on!
+AM_INIT_AUTOMAKE(php, 4.0pa1)
+
+PHP_VERSION=$VERSION
+echo "#define PHP_VERSION \"$PHP_VERSION\"" > php_version.h.new
+if ! cmp php_version.h.new php_version.h >/dev/null; then
+ rm -f php_version.h && mv php_version.h.new php_version.h && \
+ echo 'Updated php_version.h'
+else
+ rm -f php_version.h.new
+fi
+AC_SUBST(PHP_VERSION)
+
+AM_CONFIG_HEADER(config.h)
+AM_MAINTAINER_MODE
+
+dnl We want this one before the checks, so the checks can modify CFLAGS.
+test -z "$CFLAGS" && auto_cflags=1
+
+dnl Checks for programs.
+AC_PROG_YACC
+if test "$YACC" != "bison -y"; then
+ AC_MSG_WARN(You will need bison if you want to regenerate the PHP parsers.)
+else
+ AC_MSG_CHECKING(bison version)
+ set `$YACC --version| sed -e 's/^GNU Bison version //' -e 's/\./ /'`
+ if test "$1" = "1" -a "$2" -lt "25"; then
+ AC_MSG_WARN(You will need bison 1.25 if you want to regenerate the PHP parsers (found $1.$2).)
+ fi
+ AC_MSG_RESULT($1.$2 (ok))
+fi
+
+dnl ## there has to be a better way...
+dnl## OLDLIBS=$LIBS; LIBS=""
+AC_PROG_CC
+dnl## LIBS=$OLDLIBS
+
+AC_PROG_RANLIB
+AC_PROG_CC_C_O
+AC_PATH_PROG(PERL_PATH, perl)
+
+dnl Ugly hack to get around a problem with gcc on AIX.
+if test "$CC" = "gcc" -a "$ac_cv_prog_cc_g" = "yes" -a \
+ "`uname -sv`" = "AIX 4"; then
+ CFLAGS=`echo $CFLAGS | sed -e 's/-g//'`
+fi
+
+dnl check for -R, etc. switch
+AC_MSG_CHECKING(if compiler supports -R)
+AC_CACHE_VAL(php_cv_cc_dashr,[
+ SAVE_LIBS="${LIBS}"
+ LIBS="-R /usr/lib ${LIBS}"
+ AC_TRY_LINK([], [], php_cv_cc_dashr=yes, php_cv_cc_dashr=no)
+ LIBS="${SAVE_LIBS}"])
+AC_MSG_RESULT($php_cv_cc_dashr)
+if test $php_cv_cc_dashr = "yes"; then
+ ld_runpath_switch="-R"
+ apxs_runpath_switch="-Wl,-R"
+else
+ AC_MSG_CHECKING([if compiler supports -Wl,-rpath,])
+ AC_CACHE_VAL(php_cv_cc_rpath,[
+ SAVE_LIBS="${LIBS}"
+ LIBS="-Wl,-rpath,/usr/lib ${LIBS}"
+ AC_TRY_LINK([], [], php_cv_cc_rpath=yes, php_cv_cc_rpath=no)
+ LIBS="${SAVE_LIBS}"])
+ AC_MSG_RESULT($php_cv_cc_rpath)
+ if test $php_cv_cc_rpath = "yes"; then
+ ld_runpath_switch="-Wl,-rpath,"
+ apxs_runpath_switch="-Wl,-rpath "
+ else
+ dnl something innocuous
+ ld_runpath_switch="-L"
+ apxs_runpath_switch="-L"
+ fi
+fi
+
+
+dnl Check compiler support for -rdynamic
+AC_MSG_CHECKING(if compiler supports -rdynamic)
+AC_CACHE_VAL(php_cc_rdynamic,[
+ SAVE_LIBS="${LIBS}"
+ LIBS="-rdynamic ${LIBS}"
+ AC_TRY_LINK([], [], php_cc_rdynamic=yes, php_cc_rdynamic=no)
+ LIBS="${SAVE_LIBS}"])
+AC_MSG_RESULT($php_cc_rdynamic)
+if test $php_cc_rdynamic = "yes"; then
+ LDFLAGS="${LDFLAGS} -rdynamic"
+ RDYNAMIC_LFLAGS="-rdynamic"
+else
+ RDYNAMIC_LFLAGS=""
+fi
+AC_SUBST(RDYNAMIC_LFLAGS)
+
+
+dnl AC_PROG_INSTALL
+AC_PATH_PROG(PROG_SENDMAIL, sendmail, /usr/lib/sendmail, $PATH /usr/bin /usr/sbin /usr/etc /etc /usr/ucblib)
+if test -n "$PROG_SENDMAIL"; then
+ AC_DEFINE(HAVE_SENDMAIL)
+fi
+
+dnl
+dnl Check for /usr/pkg/{lib,include} which is where NetBSD puts binary
+dnl and source packages. This should be harmless on other OSs.
+dnl
+if test -d /usr/pkg/include -a -d /usr/pkg/lib ; then
+ CFLAGS="$CFLAGS -I/usr/pkg/include"
+ LDFLAGS="$LDFLAGS -L/usr/pkg/lib"
+fi
+
+INCLUDES=""
+AC_SUBST(INCLUDES)
+
+AC_PREFERRED_DB_LIB
+
+AC_CHECK_LIB(nsl, gethostname, [
+ LIBS="-lnsl $LIBS"
+ AC_DEFINE(HAVE_LIBNSL) ], [])
+
+AC_CHECK_LIB(c, socket, [:], [
+ AC_CHECK_LIB(socket, socket, [
+ LIBS="-lsocket $LIBS"
+ AC_DEFINE(HAVE_LIBSOCKET) ], []) ])
+
+AC_CHECK_LIB(c, gethostbyaddr, [:], [
+ AC_CHECK_LIB(nsl, gethostbyaddr, [
+ LIBS="-lnsl $LIBS"
+ AC_DEFINE(HAVE_LIBNSL) ], []) ])
+
+AC_CHECK_LIB(c, crypt, [:], [
+ AC_CHECK_LIB(crypt, crypt, [
+ LIBS="-lcrypt $LIBS"
+ AC_DEFINE(HAVE_LIBCRYPT) ], []) ])
+
+AC_CHECK_LIB(c, dlopen, [
+ # fake it
+ AC_DEFINE(HAVE_LIBDL) ], [
+ AC_CHECK_LIB(dl, dlopen, [
+ LIBS="-ldl $LIBS"
+ AC_DEFINE(HAVE_LIBDL) ], []) ])
+
+dnl The sin may be in a library which need not be specifed
+dnl as well as res_search resides in libsocket
+AC_CHECK_LIB(c, sin, [:], [
+ AC_CHECK_LIB(m, sin) ])
+
+dnl The res_search may be in libsocket as well, and if it is
+dnl make sure to check for dn_skipname in libresolv, or if res_search
+dnl is in neither of these libs, still check for dn_skipname in libresolv
+AC_CHECK_LIB(socket, res_search, [
+ AC_CHECK_LIB(resolv, dn_skipname)
+ LIBS="$LIBS -lsocket"
+ AC_DEFINE(HAVE_LIBSOCKET) ], [
+ AC_CHECK_LIB(resolv, res_search, [
+ LIBS="$LIBS -lresolv"
+ AC_DEFINE(HAVE_LIBRESOLV)
+ ], [
+ AC_CHECK_LIB(resolv, dn_skipname)
+ ])
+])
+
+dnl Checks for header files.
+AC_HEADER_STDC
+
+dnl In QNX opendir resides in libc but dirent.h is still required
+if test "`uname -s 2>/dev/null`" != "QNX"; then
+ AC_HEADER_DIRENT
+else
+ AC_CHECK_HEADERS(dirent.h)
+fi
+AC_MISSING_FCLOSE_DECL
+dnl QNX requires unix.h to allow functions in libunix to work properly
+AC_CHECK_HEADERS(fcntl.h unistd.h crypt.h sys/file.h memory.h pwd.h grp.h sys/socket.h sys/wait.h syslog.h string.h sys/varargs.h stdarg.h sys/time.h signal.h netinet/in.h dlfcn.h limits.h sys/types.h unix.h)
+if test "$DBM_LIB" = "-lgdbm"; then
+ AC_CHECK_HEADER(gdbm.h, [ GDBM_INCLUDE="" ], [
+ AC_MSG_RESULT("Try /usr/local/include/gdbm.h");
+ AC_CHECK_HEADER(/usr/local/include/gdbm.h, [ GDBM_INCLUDE="-I/usr/local/include" ],[
+ AC_MSG_RESULT("Try /opt/local/include/gdbm.h");
+ AC_CHECK_HEADER(/opt/local/include/gdbm.h, [ GDBM_INCLUDE="-I/opt/local/include" ],[
+ dnl if in /usr/pkg/include, do not add anything. See above.
+ AC_MSG_RESULT("Try /usr/pkg/include/gdbm.h");
+ AC_CHECK_HEADER(/usr/pkg/include/gdbm.h, [ GDBM_INCLUDE="" ],[
+ AC_MSG_RESULT("Giving up - You need to install gdbm.h somewhere");
+ exit
+ ])
+ ])
+ ])
+ ])
+ INCLUDES="$INCLUDES $GDBM_INCLUDES"
+dnl## AC_SUBST(GDBM_INCLUDE)
+fi
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_STRUCT_TM
+AC_STRUCT_TIMEZONE
+
+dnl Check for members of the stat structure
+AC_STRUCT_ST_BLKSIZE
+dnl AC_STRUCT_ST_BLOCKS will screw QNX because fileblocks.o does not exists
+dnl The WARNING_LEVEL required because cc in QNX hates -w option without an argument
+if test "`uname -s 2>/dev/null`" != "QNX"; then
+ AC_STRUCT_ST_BLOCKS
+else
+ AC_MSG_WARN(warnings level for cc set to 0)
+ WARNING_LEVEL=0
+ AC_SUBST(WARNING_LEVEL)
+fi
+AC_STRUCT_ST_RDEV
+
+dnl Checks for types
+AC_TYPE_SIZE_T
+AC_TYPE_UID_T
+dnl This is required for QNX and may be some BSD derived systems
+AC_CHECK_TYPE( uint, unsigned int )
+AC_CHECK_TYPE( ulong, unsigned long )
+
+dnl Checks for library functions.
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS(memcpy memmove strdup strerror strcasecmp strstr flock lockf putenv tempnam usleep setlocale gettimeofday setvbuf srand48 lrand48 srandom random link symlink regcomp getlogin cuserid vsnprintf snprintf gcvt utime crypt rint unsetenv strftime setsockopt tzset)
+AC_FUNC_UTIME_NULL
+AC_FUNC_ALLOCA
+dnl## OLDLIBS=$LIBS; LIBS=""
+AC_BROKEN_SPRINTF
+dnl## LIBS=$OLDLIBS
+AC_REPLACE_FUNCS(getopt)
+
+dnl AIX keeps in_addr_t in /usr/include/netinet/in.h
+dnl AC_MSG_CHECKING(for in_addr_t)
+AC_CACHE_VAL(ac_cv_type_$1,
+[AC_EGREP_CPP(dnl
+changequote(<<,>>)dnl
+<<in_addr_t[^a-zA-Z_0-9]>>dnl
+changequote([,]), [#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif], ac_cv_type_in_addr_t=yes, ac_cv_type_in_addr_t=no)])dnl
+
+dnl AC_MSG_RESULT($ac_cv_type_in_addr_t)
+if test $ac_cv_type_in_addr_t = no; then
+ AC_DEFINE(in_addr_t, u_int)
+fi
+
+AC_CRYPT_CAP
+
+divert(2)
+
+AC_MSG_CHECKING(whether to use bundled regex library)
+AC_ARG_WITH(system-regex,
+[ --with-system-regex Do not use the bundled regex library],
+[
+ REGEX_LIB=
+ HSREGEX=no
+ AC_MSG_RESULT(no)
+ AC_DEFINE(REGEX,0)
+],[
+ REGEX_LIB=regex/libregex.a
+ HSREGEX=yes
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HSREGEX)
+ AC_DEFINE(REGEX,1)
+])
+AC_SUBST(REGEX_LIB)
+AC_SUBST(HSREGEX)
+
+AC_MSG_CHECKING(for Apache module support via DSO through APXS)
+AC_ARG_WITH(apxs,
+[ --with-apxs[=FILE] Build shared Apache module. FILE is the optional
+ pathname to the Apache apxs tool; defaults to "apxs".
+ (This option needs Perl installed)],
+[
+ if test "$withval" = "yes"; then
+ withval=apxs
+ fi
+ APXS="$withval"
+ APXS_LDFLAGS="@DBASE_LIB@ @ORACLE_LFLAGS@ @ORACLE_LIBS@ @IODBC_LFLAGS@ @IODBC_LIBS@ @SYBASE_LFLAGS@ @SYBASE_LIBS@ @SYBASE_CT_LFLAGS@ @SYBASE_CT_LIBS@ @MYSQL_LFLAGS@ @MYSQL_LIBS@ @MSQL_LFLAGS@ @MSQL_LIBS@ @ADA_LFLAGS@ @ADA_LIBS@ @SOLID_LIBS@ @EMPRESS_LIBS@ @OPENLINK_LIBS@ @PGSQL_LFLAGS@ @PGSQL_LIBS@ @LDAP_LFLAGS@ @LDAP_LIBS@ @VELOCIS_LIBS@ @CODBC_LFLAGS@ @CODBC_LIBS@ @ZLIB_LIBS@ @PDFLIB_LIBS@ @FDFTK_LIBS@ @IFX_LFLAGS@ @IFX_LIBS@ @IBASE_LFLAGS@ @IBASE_LIBS@"
+ APACHE_INCLUDE="-I`$APXS -q INCLUDEDIR`"
+ BINNAME=libphp3.so
+ INSTALL_IT="\$(APXS) -i -a -n php3 $BINNAME"
+ CFLAGS_SHLIB=`perl -V:cccdlflags | cut -d\' -f2`
+ LDFLAGS_SHLIB=`perl -V:lddlflags | cut -d\' -f2`
+ LDFLAGS_SHLIB_EXPORT=`perl -V:ccdlflags | cut -d\' -f2`
+ PHP_LIBS=
+ STRONGHOLD=
+ AC_DEFINE(APACHE)
+ AC_SUBST(APXS)
+ AC_SUBST(APXS_LDFLAGS)
+ AC_SUBST(BINNAME)
+ AC_SUBST(INSTALL_IT)
+ AC_SUBST(PHP_LIBS)
+ AC_DEFINE(HAVE_AP_CONFIG_H)
+ AC_DEFINE(HAVE_AP_COMPAT_H)
+ AC_MSG_RESULT(yes)
+],[
+ AC_MSG_RESULT(no)
+])
+
+
+APACHE_INSTALL_FILES="$srcdir/mod_php3.* $srcdir/php_version.h libphp3.module $srcdir/libzend/libzend.a"
+
+
+AC_MSG_CHECKING(for Apache module support via DSO through APACI)
+AC_ARG_WITH(shared-apache,
+[ --with-shared-apache[=DIR] Build shared Apache module. DIR is the top-level
+ Apache build directory, defaults to /usr/local/etc/httpd.
+ (This option needs Perl installed)],
+[
+ if test "$withval" = "yes"; then
+ # Apache's default directory
+ withval=/usr/local/etc/httpd
+ fi
+ if test "$withval" != "no"; then
+ if test -f $withval/src/include/httpd.h; then
+ APACHE_INCLUDE="-I$withval/src/include -I$withval/src/os/unix"
+ APACHE_TARGET=$withval/src/modules/php3
+ if test ! -d $APACHE_TARGET; then
+ mkdir $APACHE_TARGET
+ fi
+ CFLAGS_SHLIB=`perl -V:cccdlflags | cut -d\' -f2`
+ LDFLAGS_SHLIB=`perl -V:lddlflags | cut -d\' -f2`
+ LDFLAGS_SHLIB_EXPORT=`perl -V:ccdlflags | cut -d\' -f2`
+ PHP_LIBS=
+ BINNAME=libmodphp3-so.a
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET; cp apMakefile.tmpl $APACHE_TARGET/Makefile.tmpl; cp apMakefile.libdir $APACHE_TARGET/Makefile.libdir"
+ AC_DEFINE(APACHE)
+ AC_MSG_RESULT(yes - Shared Apache 1.3.x)
+ STRONGHOLD=
+ if test -f $withval/src/include/ap_config.h; then
+ AC_DEFINE(HAVE_AP_CONFIG_H)
+ fi
+ if test -f $withval/src/include/ap_compat.h; then
+ AC_DEFINE(HAVE_AP_COMPAT_H)
+ if test ! -f $withval/src/include/ap_config_auto.h; then
+ AC_MSG_ERROR(Please run Apache's configure or src/Configure program once and try again)
+ fi
+ else
+ if test -f $withval/src/include/compat.h; then
+ AC_DEFINE(HAVE_OLD_COMPAT_H)
+ fi
+ fi
+ else
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR(Invalid Apache directory - unable to find httpd.h under $withval/src/include)
+ fi
+ fi
+ INCLUDES="$INCLUDES $APACHE_INCLUDE"
+dnl## AC_SUBST(APACHE_INCLUDE)
+ AC_SUBST(APACHE_TARGET)
+ AC_SUBST(INSTALL_IT)
+ AC_SUBST(BINNAME)
+ AC_SUBST(PHP_LIBS)
+],[
+ AC_MSG_RESULT(no)
+])
+
+
+
+if test "$BINNAME" != "libmodphp3-so.a"; then
+if test "$BINNAME" != "libphp3.so"; then
+AC_MSG_CHECKING(for Apache module support)
+AC_ARG_WITH(apache,
+[ --with-apache[=DIR] Build Apache module. DIR is the top-level Apache
+ build directory, defaults to /usr/local/etc/httpd.],
+[
+ if test "$withval" = "yes"; then
+ # Apache's default directory
+ withval=/usr/local/etc/httpd
+ fi
+ if test "$withval" != "no"; then
+# For Apache 1.2.x
+ if test -f $withval/src/httpd.h; then
+ APACHE_INCLUDE=-I$withval/src
+ APACHE_TARGET=$withval/src
+ BINNAME=libphp3.a
+ if test "$with_dbase" = "yes"; then
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES dbase/libdbf.a $APACHE_TARGET"
+ PHP_LIBS="-L. -lphp3 -ldbf"
+ else
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET"
+ PHP_LIBS="-L. -lphp3"
+ fi
+ AC_DEFINE(APACHE)
+ AC_MSG_RESULT(yes - Apache 1.2.x)
+ STRONGHOLD=
+ if test -f $withval/src/ap_config.h; then
+ AC_DEFINE(HAVE_AP_CONFIG_H)
+ fi
+# For Apache 1.3.x
+ elif test -f $withval/src/main/httpd.h; then
+ APACHE_INCLUDE="-I$withval/src/main -I$withval/src/os/unix -I$withval/src/ap"
+ APACHE_TARGET=$withval/src/modules/php3
+ if test ! -d $APACHE_TARGET; then
+ mkdir $APACHE_TARGET
+ fi
+ BINNAME=libmodphp3.a
+ if test "$with_dbase" = "yes"; then
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES dbase/libdbf.a $APACHE_TARGET; cp $srcdir/apMakefile.tmpl $APACHE_TARGET/Makefile.tmpl; cp $srcdir/apMakefile.libdir $APACHE_TARGET/Makefile.libdir"
+ PHP_LIBS="-Lmodules/php3 -L../modules/php3 -L../../modules/php3 -lmodphp3 -ldbf"
+ else
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET; cp $srcdir/apMakefile.tmpl $APACHE_TARGET/Makefile.tmpl; cp $srcdir/apMakefile.libdir $APACHE_TARGET/Makefile.libdir"
+ PHP_LIBS="-Lmodules/php3 -L../modules/php3 -L../../modules/php3 -lmodphp3"
+ fi
+ AC_DEFINE(APACHE)
+ AC_MSG_RESULT(yes - Apache 1.3.x)
+ STRONGHOLD=
+ if test -f $withval/src/include/ap_config.h; then
+ AC_DEFINE(HAVE_AP_CONFIG_H)
+ fi
+ if test -f $withval/src/include/ap_compat.h; then
+ AC_DEFINE(HAVE_AP_COMPAT_H)
+ if test ! -f $withval/src/include/ap_config_auto.h; then
+ AC_MSG_ERROR(Please run Apache's configure or src/Configure program once and try again)
+ fi
+ else
+ if test -f $withval/src/include/compat.h; then
+ AC_DEFINE(HAVE_OLD_COMPAT_H)
+ fi
+ fi
+# Also for Apache 1.3.x
+ elif test -f $withval/src/include/httpd.h; then
+ APACHE_INCLUDE="-I$withval/src/include -I$withval/src/os/unix"
+ APACHE_TARGET=$withval/src/modules/php3
+ if test ! -d $APACHE_TARGET; then
+ mkdir $APACHE_TARGET
+ fi
+ BINNAME=libmodphp3.a
+ if test "$with_dbase" = "yes"; then
+ PHP_LIBS="-Lmodules/php3 -L../modules/php3 -L../../modules/php3 -lmodphp3 -ldbf"
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES dbase/libdbf.a $APACHE_TARGET; cp $srcdir/apMakefile.tmpl $APACHE_TARGET/Makefile.tmpl; cp $srcdir/apMakefile.libdir $APACHE_TARGET/Makefile.libdir"
+ else
+ PHP_LIBS="-Lmodules/php3 -L../modules/php3 -L../../modules/php3 -lmodphp3"
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET; cp $srcdir/apMakefile.tmpl $APACHE_TARGET/Makefile.tmpl; cp $srcdir/apMakefile.libdir $APACHE_TARGET/Makefile.libdir"
+ fi
+ AC_DEFINE(APACHE)
+ AC_MSG_RESULT(yes - Apache 1.3.x)
+ STRONGHOLD=
+ if test -f $withval/src/include/ap_config.h; then
+ AC_DEFINE(HAVE_AP_CONFIG_H)
+ fi
+ if test -f $withval/src/include/ap_compat.h; then
+ AC_DEFINE(HAVE_AP_COMPAT_H)
+ if test ! -f $withval/src/include/ap_config_auto.h; then
+ AC_MSG_ERROR(Please run Apache's configure or src/Configure program once and try again)
+ fi
+ else
+ if test -f $withval/src/include/compat.h; then
+ AC_DEFINE(HAVE_OLD_COMPAT_H)
+ fi
+ fi
+# For StrongHold 2.2
+ elif test -f $withval/apache/httpd.h; then
+ APACHE_INCLUDE=-"I$withval/apache -I$withval/ssl/include"
+ APACHE_TARGET=$withval/apache
+ BINNAME=libmodphp3.a
+ if test "$with_dbase" = "yes"; then
+ PHP_LIBS="-Lmodules/php3 -L../modules/php3 -L../../modules/php3 -lmodphp3 -ldbf"
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES dbase/libdbf.a $APACHE_TARGET"
+ else
+ PHP_LIBS="-Lmodules/php3 -L../modules/php3 -L../../modules/php3 -lmodphp3"
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET"
+ fi
+ STRONGHOLD=-DSTRONGHOLD=1
+ AC_DEFINE(APACHE)
+ AC_MSG_RESULT(yes - StrongHold)
+ if test -f $withval/apache/ap_config.h; then
+ AC_DEFINE(HAVE_AP_CONFIG_H)
+ fi
+ if test -f $withval/src/ap_compat.h; then
+ AC_DEFINE(HAVE_AP_COMPAT_H)
+ if test ! -f $withval/src/include/ap_config_auto.h; then
+ AC_MSG_ERROR(Please run Apache's configure or src/Configure program once and try again)
+ fi
+ else
+ if test -f $withval/src/compat.h; then
+ AC_DEFINE(HAVE_OLD_COMPAT_H)
+ fi
+ fi
+ else
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR(Invalid Apache directory - unable to find httpd.h under $withval)
+ fi
+ else
+ AC_MSG_RESULT(no)
+ BINNAME=php
+ INSTALL_IT="cp $BINNAME \$(bindir)"
+ fi
+],[
+ AC_MSG_RESULT(no)
+ BINNAME=php
+ INSTALL_IT="cp $BINNAME \$(bindir)"
+])
+INCLUDES="$INCLUDES $APACHE_INCLUDE"
+dnl## AC_SUBST(APACHE_INCLUDE)
+AC_SUBST(APACHE_TARGET)
+AC_SUBST(INSTALL_IT)
+AC_SUBST(BINNAME)
+AC_SUBST(STRONGHOLD)
+AC_SUBST(PHP_LIBS)
+fi
+fi
+
+AC_MSG_CHECKING(for mod_charset compatibility option)
+AC_ARG_WITH(mod_charset,
+[ --with-mod_charset Enable transfer tables for mod_charset (Rus Apache).],
+[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(USE_TRANSFER_TABLES)
+],[
+ AC_MSG_RESULT(no)
+])
+
+AC_MSG_CHECKING(for fhttpd module support)
+AC_ARG_WITH(fhttpd,
+[ --with-fhttpd[=DIR] Build fhttpd module. DIR is the fhttpd sources
+ directory, defaults to /usr/local/src/fhttpd.],
+[
+ if test "$withval" = "yes"; then
+ # fhttpd source directory
+ withval=/usr/local/src/fhttpd
+ fi
+ if test "$withval" != "no"; then
+# For fhttpd 0.3.x
+ if test -f $withval/servproc.h; then
+ FHTTPD_INCLUDE=-I$withval/
+ FHTTPD_LIB=$withval/servproc.o
+ FHTTPD_TARGET=$withval/
+ BINNAME=php
+ AC_DEFINE(FHTTPD)
+ AC_MSG_RESULT(yes - fhttpd 0.3.x)
+ else
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR(Invalid fhttpd directory - unable to find servproc.h under $withval)
+ fi
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+INCLUDES="$INCLUDES $FHTTPD_INCLUDE"
+dnl## AC_SUBST(FHTTPD_INCLUDE)
+AC_SUBST(FHTTPD_LIB)
+AC_SUBST(FHTTPD_TARGET)
+
+
+AC_MSG_CHECKING(whether to use a configuration file)
+AC_ARG_WITH(config-file-path,
+[ --with-config-file-path=PATH Sets the path in which to look for php3.ini
+ defaults to /usr/local/lib],
+[
+ if test "$withval" = "yes"; then
+ AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "/usr/local/lib")
+ AC_DEFINE(USE_CONFIG_FILE, 1)
+ AC_MSG_RESULT(yes)
+ else
+ if test "$withval" != "no"; then
+ AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "$withval")
+ AC_DEFINE(USE_CONFIG_FILE, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(CONFIGURATION_FILE_PATH, 0)
+ AC_DEFINE(USE_CONFIG_FILE, 0)
+ AC_MSG_RESULT(no)
+ fi
+ fi
+],[
+ AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "/usr/local/lib")
+ AC_DEFINE(USE_CONFIG_FILE, 1)
+ AC_MSG_RESULT(yes)
+])
+
+
+AC_MSG_CHECKING(whether to include debugging symbols)
+AC_ARG_ENABLE(debug,
+[ --enable-debug Compile with debugging symbols],
+[
+ if test "$enableval" = "yes"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(DEBUG,1)
+ PHP_DEBUG=1
+ DEBUG_CFLAGS="-g"
+ test -n "$GCC" && DEBUG_CFLAGS="$DEBUG_CFLAGS -Wall"
+ test -n "$GCC" && test "$USE_MAINTAINER_MODE" = "yes" && \
+ DEBUG_CFLAGS="$DEBUG_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations"
+ else
+ AC_MSG_RESULT(no)
+ AC_DEFINE(DEBUG,0)
+ PHP_DEBUG=0
+ DEBUG_CFLAGS=""
+ fi
+],[
+ AC_MSG_RESULT(no)
+ AC_DEFINE(DEBUG,0)
+ PHP_DEBUG=0
+ DEBUG_CFLAGS=""
+])
+AC_SUBST(DEBUG_CFLAGS)
+AC_SUBST(PHP_DEBUG)
+
+
+AC_MSG_CHECKING(whether to enable safe mode by default)
+AC_ARG_ENABLE(safe-mode,
+[ --enable-safe-mode Enable safe mode by default.],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(PHP_SAFE_MODE, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(PHP_SAFE_MODE, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(PHP_SAFE_MODE, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+AC_MSG_CHECKING(for safe mode exec dir)
+AC_ARG_WITH(exec-dir,
+[ --with-exec-dir[=DIR] Only allow executables in DIR when in safe mode
+ defaults to /usr/local/php/bin],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ AC_DEFINE(PHP_SAFE_MODE_EXEC_DIR,"/usr/local/php/bin")
+ AC_MSG_RESULT(/usr/local/php/bin)
+ else
+ AC_DEFINE_UNQUOTED(PHP_SAFE_MODE_EXEC_DIR,"$withval")
+ AC_MSG_RESULT($withval)
+ fi
+ else
+ AC_DEFINE(PHP_SAFE_MODE_EXEC_DIR,"/usr/local/php/bin")
+ AC_MSG_RESULT(/usr/local/php/bin)
+ fi
+],[
+ AC_DEFINE(PHP_SAFE_MODE_EXEC_DIR,"/usr/local/php/bin")
+ AC_MSG_RESULT(/usr/local/php/bin)
+])
+
+
+AC_MSG_CHECKING(whether to enable track_vars variables by default)
+AC_ARG_ENABLE(track-vars,
+[ --enable-track-vars Enable GET/POST/Cookie track variables by default.],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(PHP_TRACK_VARS, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(PHP_TRACK_VARS, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(PHP_TRACK_VARS, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+AC_MSG_CHECKING(whether to enable magic quotes by default)
+AC_ARG_ENABLE(magic-quotes,
+[ --enable-magic-quotes Enable magic quotes by default.],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(MAGIC_QUOTES, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(MAGIC_QUOTES, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(MAGIC_QUOTES, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+dnl AC_MSG_CHECKING(whether to enable PHP RPC support)
+dnl AC_ARG_ENABLE(php-rpc,
+dnl [ --enable-php-rpc Compile with PHP RPC support.],
+dnl [
+dnl if test "$enableval" = "yes"; then
+dnl AC_DEFINE(PHP_RPC, 1)
+dnl AC_MSG_RESULT(yes)
+dnl else
+dnl AC_DEFINE(PHP_RPC, 0)
+dnl AC_MSG_RESULT(no)
+dnl fi
+dnl ],[
+dnl AC_DEFINE(PHP_RPC, 0)
+dnl AC_MSG_RESULT(no)
+dnl ])
+
+AC_MSG_CHECKING(whether to enable bc style precision math functions)
+AC_ARG_ENABLE(bcmath,
+[ --disable-bcmath Compile without bc style precision math functions. ],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(WITH_BCMATH, 1)
+ AC_MSG_RESULT(yes)
+ BCMATH_SRC="functions/bcmath.c functions/number.c"
+ else
+ AC_DEFINE(WITH_BCMATH, 0)
+ AC_MSG_RESULT(no)
+ BCMATH_SRC=""
+ fi
+],[
+ AC_DEFINE(WITH_BCMATH, 1)
+ AC_MSG_RESULT(yes)
+ BCMATH_SRC="functions/bcmath.c functions/number.c"
+])
+AC_SUBST(BCMATH_SRC)
+
+if test "$BINNAME" = "php"; then
+AC_MSG_CHECKING(whether to force Apache CGI redirect)
+AC_ARG_ENABLE(force-cgi-redirect,
+[ --enable-force-cgi-redirect Enable the security check for internal server
+ redirects. You should use this if you are
+ running the CGI version with Apache. ],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(FORCE_CGI_REDIRECT, 1)
+ AC_MSG_RESULT(yes)
+ REDIRECT=1
+ else
+ AC_DEFINE(FORCE_CGI_REDIRECT, 0)
+ AC_MSG_RESULT(no)
+ REDIRECT=0
+ fi
+],[
+ AC_DEFINE(FORCE_CGI_REDIRECT, 0)
+ AC_MSG_RESULT(no)
+ REDIRECT=0
+])
+
+AC_MSG_CHECKING(whether to discard path_info + path_translated)
+AC_ARG_ENABLE(discard_path,
+[ --enable-discard-path If this is enabled, the PHP CGI binary
+ can safely be placed outside of the
+ web tree and people will not be able
+ to circumvent .htaccess security. ],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(DISCARD_PATH, 1)
+ AC_MSG_RESULT(yes)
+ DISCARD_PATH=1
+ else
+ AC_DEFINE(DISCARD_PATH, 0)
+ AC_MSG_RESULT(no)
+ DISCARD_PATH=0
+ fi
+],[
+ AC_DEFINE(DISCARD_PATH, 0)
+ AC_MSG_RESULT(no)
+ DISCARD_PATH=0
+])
+fi
+
+AC_MSG_CHECKING(whether to enable a memory limit)
+AC_ARG_ENABLE(memory-limit,
+[ --enable-memory-limit Compile with memory limit support. ],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(MEMORY_LIMIT, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(MEMORY_LIMIT, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(MEMORY_LIMIT, 0)
+ AC_MSG_RESULT(no)
+])
+
+AC_MSG_CHECKING(whether to enable short tags by default)
+AC_ARG_ENABLE(short-tags,
+[ --disable-short-tags Disable the short-form <? start tag by default.],
+[
+ if test "$enableval" = "no"; then
+ AC_DEFINE(DEFAULT_SHORT_OPEN_TAG, 0)
+ AC_MSG_RESULT(no)
+ else
+ AC_DEFINE(DEFAULT_SHORT_OPEN_TAG, 1)
+ AC_MSG_RESULT(yes)
+ fi
+],[
+ AC_DEFINE(DEFAULT_SHORT_OPEN_TAG, 1)
+ AC_MSG_RESULT(yes)
+])
+
+AC_MSG_CHECKING(whether to enable the URL-aware fopen wrapper)
+AC_ARG_ENABLE(url-fopen-wrapper,
+[ --disable-url-fopen-wrapper Disable the URL-aware fopen wrapper that allows
+ accessing files via http or ftp.],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(PHP3_URL_FOPEN, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(PHP3_URL_FOPEN, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(PHP3_URL_FOPEN, 1)
+ AC_MSG_RESULT(yes)
+])
+
+
+divert(3)
+
+# reading config stubs
+esyscmd(./scripts/config-stubs)
+
+AC_MSG_CHECKING(for IMAP support)
+AC_ARG_WITH(imap,
+[ --with-imap[=DIR] Include IMAP support (DIR is the IMAP include dir and c-client.a dir).],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ IMAP_DIR=/usr/local
+ else
+ IMAP_DIR=$withval
+ fi
+ if test ! -f $IMAP_DIR/include/mail.h; then
+ AC_MSG_ERROR(could not find mail.h in $IMAP_DIR/include !)
+ fi
+ if test ! -f $IMAP_DIR/include/rfc822.h; then
+ AC_MSG_ERROR(could not find rfc822.h in $IMAP_DIR/include !)
+ fi
+ if test ! -f $IMAP_DIR/include/linkage.h; then
+ AC_MSG_ERROR(could not find linkage.h in $IMAP_DIR/include !)
+ fi
+ if test ! -f $IMAP_DIR/lib/c-client.a; then
+ AC_MSG_ERROR(could not find c-client.a in $IMAP_DIR/lib !)
+ fi
+ IMAP_INCLUDE="-I$IMAP_DIR/include/"
+ IMAP_LIBS="$IMAP_DIR/lib/c-client.a"
+
+dnl## AC_SUBST(IMAP_INCLUDE)
+ INCLUDES="$INCLUDES $IMAP_INCLUDE"
+ AC_SUBST(IMAP_LIBS)
+ LIBS="$LIBS $IMAP_LIBS"
+ AC_DEFINE(HAVE_IMAP)
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_ERROR(could not find imap library!)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+
+
+AC_MSG_CHECKING(for Oracle support)
+AC_ARG_WITH(oracle,
+[ --with-oracle[=DIR] Include Oracle database support. DIR is Oracle's
+ home directory, defaults to \$ORACLE_HOME.],
+[
+ case "$withval" in
+ yes)
+ ORACLEINST_TOP=$ORACLE_HOME
+ AC_MSG_RESULT(yes)
+ ;;
+ no)
+ ORACLEINST_TOP=
+ AC_MSG_RESULT(no)
+ ;;
+ *)
+ AC_MSG_RESULT(yes)
+ ORACLEINST_TOP=$withval
+ ;;
+ esac
+
+ if test "$ORACLEINST_TOP" != ""
+ then
+
+ # Oracle include files
+
+ if test -f "$ORACLEINST_TOP/rdbms/public/ocidfn.h"
+ then
+ # V8.0.5
+ ORACLE_INCLUDE="$ORACLE_INCLUDE -I$ORACLEINST_TOP/rdbms/public"
+ elif test -f "$ORACLEINST_TOP/rdbms/demo/ocidfn.h"
+ then
+ # V7.[0123]
+ ORACLE_INCLUDE=-I$ORACLEINST_TOP/rdbms/demo
+ fi
+
+ if test -d "$ORACLEINST_TOP/network/public"
+ then
+ # V8
+ ORACLE_INCLUDE="$ORACLE_INCLUDE -I$ORACLEINST_TOP/network/public"
+ fi
+
+ if test -d "$ORACLEINST_TOP/plsql/public"
+ then
+ # V8
+ ORACLE_INCLUDE="$ORACLE_INCLUDE -I$ORACLEINST_TOP/plsql/public"
+ fi
+
+ # Need to know the version, otherwhise we will mixup nlsrtl
+ AC_ORACLE_VERSION($ORACLEINST_TOP)
+
+ # Oracle libs - nightmare :-)
+
+ ORACLE_LIBDIR=lib
+ ORACLE_LFLAGS="-L$ORACLEINST_TOP/$ORACLE_LIBDIR ${ld_runpath_switch}$ORACLEINST_TOP/$ORACLE_LIBDIR"
+ if test -f "$ORACLEINST_TOP/rdbms/lib/sysliblist"
+ then
+ ORA_SYSLIB="`cat $ORACLEINST_TOP/rdbms/lib/sysliblist`"
+ else
+ ORA_SYSLIB="-lm"
+ fi
+
+ # Oracle Static libs
+ case $ORACLE_VERSION in
+ 7.0|7.1)
+ ORACLE_STLIBS="-locic $ORACLEINST_TOP/$ORACLE_LIBDIR/osntab.o \
+ -lsqlnet -lora -lsqlnet -lnlsrtl -lcv6 -lcore -lnlsrtl -lcv6 \
+ -lcore $ORA_SYSLIB -lcore $ORA_SYSLIB"
+ if test "`uname -s 2>/dev/null`" = "AIX"; then
+ ORACLE_STLIBS="$ORACLE_STLIBS -bI:$ORACLE_HOME/lib/mili.exp"
+ fi
+ ;;
+ 7.2)
+ ORACLE_STLIBS="-locic $ORACLEINST_TOP/$ORACLE_LIBDIR/osntab.o \
+ -lsqlnet -lora -lsqlnet -lora -lnlsrtl3 -lc3v6 -lcore3 -lnlsrtl3 \
+ -lcore3 $ORA_SYSLIB -lcore3 $ORA_SYSLIB"
+ ;;
+ 7.3)
+ ORACLE_STLIBS="-lclient -lsqlnet -lncr -lsqlnet -lclient -lcommon \
+ -lgeneric -lsqlnet -lncr -lsqlnet -lclient -lcommon -lgeneric \
+ -lepc -lnlsrtl3 -lc3v6 -lcore3 -lnlsrtl3 -lcore3 -lnlsrtl3 \
+ $ORA_SYSLIB -lcore3 $ORA_SYSLIB"
+ ;;
+ 8.0)
+ ORACLE_STLIBS="-lclient -lsqlnet -lncr -lsqlnet -lclient -lcommon \
+ -lgeneric -lsqlnet -lncr -lsqlnet -lclient -lcommon -lgeneric \
+ -lepc -lnlsrtl3 -lc3v6 -lcore4 -lnlsrtl3 -lcore4 -lnlsrtl3 \
+ $ORA_SYSLIB -lcore3 $ORA_SYSLIB"
+ ;;
+ *)
+ ORACLE_STLIBS=
+ ;;
+ esac
+
+ # Oracle shared libs
+ case $ORACLE_VERSION in
+ 7.0)
+ # shared libs not supported
+ ORACLE_SHLIBS="$ORACLE_STLIBS"
+ ;;
+ 7.1)
+ if test -f $ORACLEINST_TOP/$ORACLE_LIBDIR/liboracle.s?
+ then
+ ORACLE_SHLIBS="-loracle $ORA_SYSLIB"
+ else
+ ORACLE_SHLIBS="$ORACLE_STLIBS"
+ fi
+ ;;
+ 7.2|7.3)
+ if test -f $ORACLEINST_TOP/$ORACLE_LIBDIR/libclntsh.s?
+ then
+ ORACLE_SHLIBS="-lclntsh $ORA_SYSLIB"
+ else
+ ORACLE_SHLIBS="$ORACLE_STLIBS"
+ fi
+ ;;
+ 8.0)
+ if test -f $ORACLEINST_TOP/$ORACLE_LIBDIR/libclntsh.s? -o \
+ -f $ORACLEINST_TOP/$ORACLE_LIBDIR/libclntsh.a # AIX
+ then
+ if test "$CC" = "gcc" -a "`uname -sv`" = "AIX 4"; then
+ # for Oracle 8 on AIX 4
+ ORA_SYSLIB="$ORA_SYSLIB -nostdlib /lib/crt0_r.o /usr/lib/libpthreads.a /usr/lib/libc_r.a -lgcc"
+ fi
+ ORACLE_SHLIBS="-lclntsh -lpsa -lcore4 -lnlsrtl3 -lclntsh $ORA_SYSLIB"
+ else
+ ORACLE_SHLIBS="$ORACLE_STLIBS"
+ fi
+ AC_DEFINE(HAVE_OCI8)
+ ;;
+ *)
+ ORACLE_SHLIBS=
+ ;;
+ esac
+
+ # only using shared libs right now
+ ORACLE_LIBS=$ORACLE_SHLIBS
+
+ AC_DEFINE(HAVE_ORACLE)
+
+ fi
+
+],[AC_MSG_RESULT(no)])
+AC_SUBST(ORACLE_SHLIBS)
+AC_SUBST(ORACLE_STLIBS)
+AC_SUBST(ORACLE_LIBS)
+AC_SUBST(ORACLE_LFLAGS)
+dnl## AC_SUBST(ORACLE_INCLUDE)
+INCLUDES="$INCLUDES $ORACLE_INCLUDE"
+AC_SUBST(ORACLE_HOME)
+AC_SUBST(ORACLE_VERSION)
+
+
+AC_MSG_CHECKING(for iODBC support)
+AC_ARG_WITH(iodbc,
+[ --with-iodbc[=DIR] Include iODBC support. DIR is the iODBC base
+ install directory, defaults to /usr/local.],
+[
+ if test "$withval" = "yes"; then
+ withval=/usr/local
+ fi
+ if test "$withval" != "no"; then
+
+ IODBC_INCDIR=$withval/include
+ IODBC_LIBDIR=$withval/lib
+ IODBC_LFLAGS=-L$IODBC_LIBDIR
+ IODBC_INCLUDE=-I$IODBC_INCDIR
+ IODBC_LIBS=-liodbc
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_IODBC)
+
+ AC_MSG_RESULT(yes)
+
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(IODBC_LIBS)
+AC_SUBST(IODBC_LFLAGS)
+dnl## AC_SUBST(IODBC_INCLUDE)
+INCLUDES="$INCLUDES $IODBC_INCLUDE"
+
+
+AC_MSG_CHECKING(for OpenLink ODBC support)
+AC_ARG_WITH(openlink,
+[ --with-openlink[=DIR] Include OpenLink ODBC support. DIR is the
+ OpenLink base install directory, defaults to
+ /usr/local/openlink.],
+[
+ if test "$withval" = "yes"; then
+ withval=/usr/local/openlink
+ fi
+ if test "$withval" != "no"; then
+
+ OPENLINK_INCDIR=$withval/odbcsdk/include
+ OPENLINK_LIBDIR=$withval/odbcsdk/lib
+ OPENLINK_LFLAGS=-L$OPENLINK_LIBDIR
+ OPENLINK_INCLUDE=-I$OPENLINK_INCDIR
+ OPENLINK_LIBS=-liodbc
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_OPENLINK)
+
+ AC_MSG_RESULT(yes)
+
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(OPENLINK_LIBS)
+AC_SUBST(OPENLINK_LFLAGS)
+dnl## AC_SUBST(OPENLINK_INCLUDE)
+INCLUDES="$INCLUDES $OPENLINK_INCLUDE"
+
+
+AC_MSG_CHECKING(for Adabas support)
+AC_ARG_WITH(adabas,
+[ --with-adabas[=DIR] Include Adabas D support. DIR is the Adabas base
+ install directory, defaults to /usr/local.],
+[
+ if test "$withval" = "yes"; then
+ withval=/usr/local
+ fi
+ if test "$withval" != "no"; then
+ ADA_INCDIR=$withval/incl
+ ADA_LIBDIR=$withval/lib
+ ADA_LFLAGS=-L$ADA_LIBDIR
+ ADA_INCLUDE=-I$ADA_INCDIR
+ ADA_LIBS="${ADA_LIBDIR}/odbclib.a -lsqlrte -lsqlptc"
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_ADABAS)
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(ADA_LIBS)
+AC_SUBST(ADA_LFLAGS)
+dnl## AC_SUBST(ADA_INCLUDE)
+INCLUDES="$INCLUDES $ADA_INCLUDE"
+
+
+AC_MSG_CHECKING(for Sybase support)
+AC_ARG_WITH(sybase,
+[ --with-sybase[=DIR] Include Sybase-DB support. DIR is the Sybase home
+ directory, defaults to /home/sybase.],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ SYBASE_INCDIR=/home/sybase/include
+ SYBASE_LIBDIR=/home/sybase/lib
+ else
+ SYBASE_INCDIR=$withval/include
+ SYBASE_LIBDIR=$withval/lib
+ fi
+ SYBASE_INCLUDE=-I$SYBASE_INCDIR
+ SYBASE_LFLAGS="-L$SYBASE_LIBDIR -L$SYBASE_LIBDIR"
+ SYBASE_LIBS=-lsybdb
+ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(dnet_stub, dnet_addr,
+ [ SYBASE_LIBS="$SYBASE_LIBS -ldnet_stub"
+ AC_DEFINE(HAVE_LIBDNET_STUB)
+ ])
+ AC_DEFINE(HAVE_SYBASE)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(SYBASE_LIBS)
+AC_SUBST(SYBASE_LFLAGS)
+dnl## AC_SUBST(SYBASE_INCLUDE)
+INCLUDES="$INCLUDES $SYBASE_INCLUDE"
+
+AC_MSG_CHECKING(for Sybase-CT support)
+AC_ARG_WITH(sybase-ct,
+[ --with-sybase-ct[=DIR] Include Sybase-CT support. DIR is the Sybase home
+ directory, defaults to /home/sybase.],
+[
+ if test "$withval" != "no"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_SYBASE_CT)
+ if test "$withval" = "yes"; then
+ SYBASE_CT_INCDIR=/home/sybase/include
+ SYBASE_CT_LIBDIR=/home/sybase/lib
+ else
+ SYBASE_CT_INCDIR=$withval/include
+ SYBASE_CT_LIBDIR=$withval/lib
+ fi
+ SYBASE_CT_INCLUDE=-I$SYBASE_CT_INCDIR
+ SYBASE_CT_LFLAGS="-L$SYBASE_CT_LIBDIR"
+ SYBASE_CT_LIBS="-lcs -lct -lcomn -lintl"
+ old_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -L$SYBASE_CT_LIBDIR"
+ AC_CHECK_LIB(tcl, netg_errstr,
+ [ SYBASE_CT_LIBS="$SYBASE_CT_LIBS -ltcl" ],
+ [ SYBASE_CT_LIBS="$SYBASE_CT_LIBS -lsybtcl" ],
+ [ $SYBASE_CT_LIBS ])
+ AC_CHECK_LIB(insck, insck__getVdate,
+ [ SYBASE_CT_LIBS="$SYBASE_CT_LIBS -linsck" ])
+ LDFLAGS=$old_LDFLAGS
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(SYBASE_CT_LIBS)
+AC_SUBST(SYBASE_CT_LFLAGS)
+dnl## AC_SUBST(SYBASE_CT_INCLUDE)
+INCLUDES="$INCLUDES $SYBASE_CT_INCLUDE"
+
+
+AC_MSG_CHECKING(for MySQL support)
+AC_ARG_WITH(mysql,
+[ --with-mysql[=DIR] Include MySQL support. DIR is the MySQL base
+ install directory, defaults to /usr/local.],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ MYSQL_INCDIR=/usr/local/include/mysql
+ MYSQL_LIBDIR=/usr/local/lib/mysql
+ else
+ if test -f $withval/include/mysql/mysql.h; then
+ MYSQL_INCDIR=$withval/include/mysql
+ MYSQL_LIBDIR=$withval/lib/mysql
+ elif test -f $withval/include/mysql.h; then
+ MYSQL_INCDIR=$withval/include
+ MYSQL_LIBDIR=$withval/lib
+ else
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR(Invalid MySQL directory - unable to find mysql.h under $withval)
+ fi
+ fi
+ MYSQL_INCLUDE=-I$MYSQL_INCDIR
+ if test -n "$APXS"; then
+ MYSQL_LFLAGS="'${apxs_runpath_switch}$MYSQL_LIBDIR' -L$MYSQL_LIBDIR"
+ else
+ MYSQL_LFLAGS="${ld_runpath_switch}$MYSQL_LIBDIR -L$MYSQL_LIBDIR"
+ fi
+ MYSQL_LIBS=-lmysqlclient
+
+ AC_DEFINE(HAVE_MYSQL)
+ AC_MSG_RESULT(yes)
+
+ dnl check for errmsg.h, which isn't installed by some versions of 3.21
+ old_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $MYSQL_INCLUDE"
+ AC_CHECK_HEADERS(errmsg.h mysql.h)
+ CPPFLAGS="$old_CPPFLAGS"
+ else
+ AC_MSG_RESULT(no)
+dnl Why are we defining HAVE_MYSQL here??
+ AC_DEFINE(HAVE_MYSQL)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(MYSQL_LIBS)
+AC_SUBST(MYSQL_LFLAGS)
+dnl## AC_SUBST(MYSQL_INCLUDE)
+INCLUDES="$INCLUDES $MYSQL_INCLUDE"
+
+
+AC_MSG_CHECKING(for mSQL support)
+AC_ARG_WITH(msql,
+[ --with-msql[=DIR] Include mSQL support. DIR is the mSQL base
+ install directory, defaults to /usr/local/Hughes.],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ MSQL_INCDIR=/usr/local/Hughes/include
+ MSQL_LIBDIR=/usr/local/Hughes/lib
+ else
+ MSQL_INCDIR=$withval/include
+ MSQL_LIBDIR=$withval/lib
+ fi
+ MSQL_INCLUDE=-I$MSQL_INCDIR
+ MSQL_LFLAGS=-L$MSQL_LIBDIR
+ MSQL_LIBS=-lmsql
+
+ AC_DEFINE(HAVE_MSQL)
+ AC_MSG_RESULT(yes)
+ AC_MSQL_VERSION
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(MSQL_LIBS)
+AC_SUBST(MSQL_LFLAGS)
+dnl## AC_SUBST(MSQL_INCLUDE)
+INCLUDES="$INCLUDES $MSQL_INCLUDE"
+
+AC_MSG_CHECKING(for PostgresSQL support)
+AC_ARG_WITH(pgsql,
+[ --with-pgsql[=DIR] Include PostgresSQL support. DIR is the PostgresSQL
+ base install directory, defaults to /usr/local/pgsql.],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ PGSQL_INCDIR=/usr/local/pgsql/include
+ PGSQL_LIBDIR=/usr/local/pgsql/lib
+ else
+ PGSQL_INCDIR=$withval/include
+ test -d $withval/include/pgsql && PGSQL_INCDIR=$withval/include/pgsql
+ PGSQL_LIBDIR=$withval/lib
+ test -d $withval/lib/pgsql && PGSQL_LIBDIR=$withval/lib/pgsql
+ fi
+ PGSQL_INCLUDE=-I$PGSQL_INCDIR
+ PGSQL_LFLAGS=-L$PGSQL_LIBDIR
+ PGSQL_LIBS=-lpq
+
+ old_CFLAGS=$CFLAGS; old_LDFLAGS=$LDFLAGS; old_LIBS=$LIBS
+ CFLAGS="$CFLAGS $PGSQL_INCLUDE"
+ LDFLAGS="$LDFLAGS $PGSQL_LFLAGS"
+ LIBS="$LIBS $PGSQL_LIBS"
+ AC_DEFINE(HAVE_PGSQL)
+ AC_MSG_RESULT(yes)
+ AC_CHECK_FUNC(PQcmdTuples,AC_DEFINE(HAVE_PQCMDTUPLES))
+ CFLAGS=$old_CFLAGS; LDFLAGS=$old_LDFLAGS; LIBS=$old_LIBS
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(PGSQL_LIBS)
+AC_SUBST(PGSQL_LFLAGS)
+dnl## AC_SUBST(PGSQL_INCLUDE)
+INCLUDES="$INCLUDES $PGSQL_INCLUDE"
+
+
+AC_MSG_CHECKING(for Solid support)
+AC_ARG_WITH(solid,
+[ --with-solid[=DIR] Include Solid support. DIR is the Solid base
+ install directory, defaults to /usr/local/solid],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ SOLID_INCDIR=/usr/local/solid/include
+ SOLID_LIBDIR=/usr/local/solid/lib
+ else
+ SOLID_INCDIR=$withval/include
+ SOLID_LIBDIR=$withval/lib
+ fi
+ SOLID_INCLUDE=-I$SOLID_INCDIR
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_SOLID)
+
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+if test "$SOLID_LIBDIR" != ""; then
+ AC_FIND_SOLID_LIBS($SOLID_LIBDIR)
+fi
+dnl## AC_SUBST(SOLID_INCLUDE)
+AC_SUBST(SOLID_LIBS)
+INCLUDES="$INCLUDES $SOLID_INCLUDE"
+
+
+AC_MSG_CHECKING(for Empress support)
+AC_ARG_WITH(empress,
+[ --with-empress[=DIR] Include Empress support. DIR is the Empress base
+ install directory, defaults to \$EMPRESSPATH],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ EMPRESS_INCDIR=$EMPRESSPATH/odbccl/include
+ EMPRESS_LIBDIR=$EMPRESSPATH/odbccl/lib
+ else
+ EMPRESS_INCDIR=$withval/include
+ EMPRESS_LIBDIR=$withval/lib
+ fi
+ EMPRESS_INCLUDE=-I$EMPRESS_INCDIR
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_EMPRESS)
+
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+if test "$EMPRESS_LIBDIR" != ""; then
+ AC_FIND_EMPRESS_LIBS($EMPRESS_LIBDIR)
+fi
+AC_SUBST(EMPRESS_LIBS)
+dnl## AC_SUBST(EMPRESS_INCLUDE)
+INCLUDES="$INCLUDES $EMPRESS_INCLUDE"
+
+
+AC_MSG_CHECKING(for LDAP support)
+AC_ARG_WITH(ldap,
+[ --with-ldap[=DIR] Include LDAP support. DIR is the LDAP base
+ install directory, defaults to /usr/local/ldap],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ LDAP_INCDIR=/usr/local/ldap/include
+ LDAP_LIBDIR=/usr/local/ldap/lib
+ else
+ LDAP_INCDIR=$withval/include
+ LDAP_LIBDIR=$withval/lib
+ fi
+ LDAP_INCLUDE=-I$LDAP_INCDIR
+ LDAP_LFLAGS="-L$LDAP_LIBDIR ${ld_runpath_switch}$LDAP_LIBDIR"
+ LDAP_LIBS="-lldap -llber"
+
+ AC_DEFINE(HAVE_LDAP)
+
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(LDAP_LIBS)
+AC_SUBST(LDAP_LFLAGS)
+dnl## AC_SUBST(LDAP_INCLUDE)
+INCLUDES="$INCLUDES $LDAP_INCLUDE"
+
+
+AC_MSG_CHECKING(for SNMP support)
+AC_ARG_WITH(snmp,
+[ --with-snmp[=DIR] Include SNMP support. DIR is the SNMP base
+ install directory, defaults to /usr/local],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ SNMP_INCDIR=/usr/local/include
+ test -d /usr/local/include/ucd-snmp && SNMP_INCDIR=/usr/local/include/ucd-snmp
+ SNMP_LIBDIR=/usr/local/lib
+ else
+ SNMP_INCDIR=$withval/include
+ test -d $withval/include/ucd-snmp && SNMP_INCDIR=$withval/include/ucd-snmp
+ SNMP_LIBDIR=$withval/lib
+ fi
+ SNMP_INCLUDE=-I$SNMP_INCDIR
+ SNMP_LFLAGS=-L$SNMP_LIBDIR
+ SNMP_LIBS="-lsnmp"
+
+ AC_DEFINE(HAVE_SNMP)
+
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(SNMP_LIBS)
+AC_SUBST(SNMP_LFLAGS)
+dnl## AC_SUBST(SNMP_INCLUDE)
+INCLUDES="$INCLUDES $SNMP_INCLUDE"
+
+
+AC_MSG_CHECKING(for Velocis support)
+AC_ARG_WITH(velocis,
+[ --with-velocis[=DIR] Include Velocis support. DIR is the Velocis
+ base install directory, defaults to /usr/local/velocis.],
+[
+ if test "$withval" != "no"; then
+ VELOCIS_OS=`uname`
+ if test "$withval" = "yes"; then
+ VELOCIS_INCDIR=/usr/local/velocis/include
+ VELOCIS_LIBDIR=/usr/local/velocis
+ else
+ VELOCIS_INCDIR=$withval/include
+ VELOCIS_LIBDIR=$withval
+ fi
+ VELOCIS_INCLUDE=-I$VELOCIS_INCDIR
+ VELOCIS_LIBDIR="$VELOCIS_LIBDIR/bin"
+ VELOCIS_LIBS="-l_rdbc -l_sql"
+ if test $VELOCIS_OS = "FreeBSD"; then
+ VELOCIS_LIBS="$VELOCIS_LIBDIR/../lib/rdscli.a -lcompat"
+ fi
+ if test $VELOCIS_OS = "BSD/OS"; then
+ VELOCIS_LIBS="$VELOCIS_LIBDIR/../lib/rdscli.a -lcompat"
+ fi
+ old_CFLAGS=$CFLAGS; old_LDFLAGS=$LDFLAGS
+ CFLAGS="$CFLAGS $VELOCIS_INCLUDE"
+ LDFLAGS="$LDFLAGS $VELOCIS_LIBS"
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_VELOCIS)
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(VELOCIS_LIBS)
+AC_SUBST(VELOCIS_LFLAGS)
+dnl## AC_SUBST(VELOCIS_INCLUDE)
+INCLUDES="$INCLUDES $VELOCIS_INCLUDE"
+
+
+AC_MSG_CHECKING(for Informix support)
+AC_ARG_WITH(informix,
+[ --with-informix[=DIR] Include Informix support. DIR is the Informix base
+ install directory, defaults to ${INFORMIXDIR:-nothing}.],
+[
+ if test "$withval" != "no"; then
+ if test "$INFORMIXDIR" = ""; then
+ INFORMIX_WARNING="
+WARNING: You asked for Informix support, but don't have \\\$INFORMIXDIR
+ environment value set up. Configuring and compiling Informix
+ support to PHP3 is impossible and has been turned off. Please
+ try again after setting up your environment."
+ AC_MSG_RESULT(no)
+ else
+ if test "$withval" = "yes"; then
+ IFX_INCDIR=$INFORMIXDIR/incl/esql
+ IFX_LIBDIR="-L$INFORMIXDIR/lib -L$INFORMIXDIR/lib/esql"
+ else
+ IFX_INCDIR=$withval/incl/esql
+ IFX_LIBDIR="-L$withval/lib -L$withval/lib/esql"
+ if test "$withval" != "$INFORMIXDIR"; then
+ INFORMIX_WARNING="
+WARNING: You specified Informix base install directory that is different
+ than your \\\$INFORMIXDIR environment variable. You'd better know
+ exactly what you are doing."
+ fi
+ fi
+ IFX_INCLUDE=-I$IFX_INCDIR
+ IFX_LFLAGS=$IFX_LIBDIR
+ if test -z "$IFX_LIBS"; then
+ IFX_LIBS=`esql -libs | sed -e 's/-lm$//'`
+ dnl -lm twice otherwise?
+ IFX_LIBS=`echo $IFX_LIBS | sed -e 's/Libraries to be used://g' -e 's/esql: error -55923: No source or object file\.//g'`
+ dnl Seems to get rid of newlines.
+ dnl According to Perls DBD-Informix, might contain these strings.
+ else
+ dnl Allow override to use static and/or threaded libs
+ IFX_LIBS="$IFX_LIBS"
+ fi
+ CFLAGS="$CFLAGS $IFX_INCLUDE"
+ LDFLAGS="$LDFLAGS $IFX_LFLAGS"
+
+ if test "`uname -s 2>/dev/null`" = "AIX"; then
+ CFLAGS="$CFLAGS -D__H_LOCALEDEF"
+ fi
+ AC_DEFINE(HAVE_IFX)
+ AC_MSG_CHECKING([Informix version])
+ IFX_VERSION=[`esql -V | sed -ne '1 s/^[^0-9]*\([0-9]\)\.\([0-9]*\).*/\1\2/p'`]
+ if test $IFX_VERSION -ge "900"; then
+ AC_DEFINE(HAVE_IFX_IUS)
+ IFX_ESQL_FLAGS="-EDHAVE_IFX_IUS"
+ else
+ IFX_ESQL_FLAGS="-EUHAVE_IFX_IUS"
+ fi
+ AC_SUBST(IFX_ESQL_FLAGS)
+ AC_DEFINE_UNQUOTED(IFX_VERSION, $IFX_VERSION)
+ AC_MSG_RESULT(yes)
+ fi
+ else
+ INFORMIXDIR=
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(IFX_LIBS)
+AC_SUBST(IFX_LFLAGS)
+AC_SUBST(INFORMIXDIR)
+dnl## AC_SUBST(IFX_INCLUDE)
+INCLUDES="$INCLUDES $IFX_INCLUDE"
+
+
+AC_MSG_CHECKING(for InterBase support)
+AC_ARG_WITH(interbase,
+[ --with-interbase[=DIR] Include InterBase support. DIR is the InterBase base
+ install directory, defaults to /usr/interbase],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ IBASE_INCDIR=/usr/interbase/include
+ IBASE_LIBDIR=/usr/interbase/lib
+ else
+ IBASE_INCDIR=$withval/include
+ IBASE_LIBDIR=$withval/lib
+ fi
+ IBASE_INCLUDE=-I$IBASE_INCDIR
+ IBASE_LFLAGS=-L$IBASE_LIBDIR
+ IBASE_LIBS="-lgds"
+
+ AC_DEFINE(HAVE_IBASE)
+
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(IBASE_LIBS)
+AC_SUBST(IBASE_LFLAGS)
+dnl## AC_SUBST(IBASE_INCLUDE)
+INCLUDES="$INCLUDES $IBASE_INCLUDE"
+
+
+AC_MSG_CHECKING(for a custom ODBC support)
+AC_ARG_WITH(custom-odbc,
+[ --with-custom-odbc[=DIR] Include a user defined ODBC support.
+ The DIR is ODBC install base directory,
+ which defaults to /usr/local.
+ Make sure to define CUSTOM_ODBC_LIBS and
+ have some odbc.h in your include dirs.
+ E.g., you should define following for
+ Sybase SQL Anywhere 5.5.00 on QNX, prior to
+ run configure script:
+ CFLAGS=\"-DODBC_QNX -DSQLANY_BUG\"
+ LDFLAGS=-lunix
+ CUSTOM_ODBC_LIBS=\"-ldblib -lodbc\".],
+[
+ if test "$withval" = "yes"; then
+ withval=/usr/local
+ fi
+ if test "$withval" != "no"; then
+
+ CODBC_INCDIR=$withval/include
+ CODBC_LIBDIR=$withval/lib
+ CODBC_LFLAGS=-L$CODBC_LIBDIR
+ CODBC_INCLUDE=-I$CODBC_INCDIR
+ CODBC_LIBS=$CUSTOM_ODBC_LIBS
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_CODBC)
+
+ AC_MSG_RESULT(yes)
+
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(CODBC_LIBS)
+AC_SUBST(CODBC_LFLAGS)
+dnl## AC_SUBST(CODBC_INCLUDE)
+INCLUDES="$INCLUDES $CODBC_INCLUDE"
+
+
+AC_MSG_CHECKING(for Hyperwave support)
+AC_ARG_WITH(hyperwave,
+[ --with-hyperwave Include Hyperwave support],
+[
+ if test "$withval" != "no"; then
+ AC_DEFINE(HYPERWAVE,1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(HYPERWAVE,0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(HYPERWAVE,0)
+ AC_MSG_RESULT(no)
+])
+
+
+AC_MSG_CHECKING(for XML support)
+AC_ARG_WITH(xml,
+[ --with-xml Include XML support],[
+ if test "$withval" = "yes"; then
+ AC_DEFINE(HAVE_LIBEXPAT, 1)
+ AC_MSG_RESULT(yes)
+ XML_LIBS="-lexpat"
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(XML_LIBS)
+
+
+AC_MSG_CHECKING(whether to include zlib support)
+AC_ARG_WITH(zlib,
+[ --with-zlib[=DIR] Include zlib support (requires zlib >= 1.0.9).
+ DIR is the zlib install directory,
+ defaults to /usr.],
+[
+ case "$withval" in
+ no)
+ AC_MSG_RESULT(no) ;;
+ yes)
+ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(z, gzgets, [AC_DEFINE(HAVE_ZLIB) ZLIB_LIBS="-lz"],
+ [AC_MSG_ERROR(Zlib module requires zlib >= 1.0.9.)]) ;;
+ *)
+ test -f $withval/include/zlib/zlib.h && ZLIB_INCLUDE="-I$withval/include/zlib"
+ test -f $withval/include/zlib.h && ZLIB_INCLUDE="-I$withval/include"
+ if test -n "$ZLIB_INCLUDE" ; then
+ AC_MSG_RESULT(yes)
+ old_LIBS=$LIBS
+ LIBS="$LIBS -L$withval/lib"
+ AC_CHECK_LIB(z, gzgets, [AC_DEFINE(HAVE_ZLIB) ZLIB_LIBS="-L$withval/lib -lz"],
+ [AC_MSG_ERROR(Zlib module requires zlib >= 1.0.9.)])
+ LIBS=$old_LIBS
+ else
+ AC_MSG_RESULT(no)
+ fi ;;
+ esac
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(ZLIB_LIBS)
+dnl## AC_SUBST(ZLIB_INCLUDE)
+INCLUDES="$INCLUDES $ZLIB_INCLUDE"
+
+
+AC_MSG_CHECKING(whether to include pdflib support)
+AC_ARG_WITH(pdflib,
+[ --with-pdflib[=DIR] Include pdflib support (tested with 0.6).
+ DIR is the pdflib install directory,
+ defaults to /usr/local.],
+[
+ case "$withval" in
+ no)
+ AC_MSG_RESULT(no) ;;
+ yes)
+ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(pdf, PDF_open, [AC_DEFINE(HAVE_PDFLIB) PDFLIB_LIBS="-lpdf"],
+ [AC_MSG_ERROR(pdflib module requires pdflib 0.6)]) ;;
+ *)
+ test -f $withval/include/pdf.h && PDFLIB_INCLUDE="-I$withval/include"
+ if test -n "$PDFLIB_INCLUDE" ; then
+ AC_MSG_RESULT(yes)
+ old_LIBS=$LIBS
+ LIBS="$LIBS -L$withval/lib"
+ AC_CHECK_LIB(pdf, PDF_open, [AC_DEFINE(HAVE_PDFLIB) PDFLIB_LIBS="-L$withval/lib -lpdf"],
+ [AC_MSG_ERROR(pdflib module requires pdflib 0.6.)])
+ LIBS=$old_LIBS
+ else
+ AC_MSG_RESULT(no)
+ fi ;;
+ esac
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(PDFLIB_LIBS)
+dnl## AC_SUBST(PDFLIB_INCLUDE)
+INCLUDES="$INCLUDES $PDFLIB_INCLUDE"
+
+
+AC_MSG_CHECKING(whether to include fdftk support)
+AC_ARG_WITH(fdftk,
+[ --with-fdftk[=DIR] Include fdftk support.
+ DIR is the fdftk lib install directory,
+ defaults to /usr/local.],
+[
+ case "$withval" in
+ no)
+ AC_MSG_RESULT(no) ;;
+ yes)
+ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(FdfTk, FDFOpen, [AC_DEFINE(HAVE_FDFLIB) FDFLIB_LIBS="-lFdfTk"],
+ [AC_MSG_ERROR(fdftk module requires fdftk 2.0)]) ;;
+ *)
+ test -f $withval/include/Fdftk.h && FDFLIB_INCLUDE="-I$withval/include"
+ if test -n "$FDFLIB_INCLUDE" ; then
+ AC_MSG_RESULT(yes)
+ old_LIBS=$LIBS
+ LIBS="$LIBS -L$withval/lib"
+ AC_CHECK_LIB(FdfTk, FDFOpen, [AC_DEFINE(HAVE_FDFLIB) FDFLIB_LIBS="-L$withval/lib -lFdfTk"],
+ [AC_MSG_ERROR(fdftk module requires ftftk lib 2.0.)])
+ LIBS=$old_LIBS
+ else
+ AC_MSG_RESULT(no)
+ fi ;;
+ esac
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(FDFLIB_LIBS)
+dnl## AC_SUBST(FDFLIB_INCLUDE)
+INCLUDES="$INCLUDES $FDFLIB_INCLUDE"
+
+
+AC_MSG_CHECKING(whether to include the bundled dbase library)
+AC_ARG_WITH(dbase,
+[ --with-dbase Include the bundled dbase library],
+[
+ if test "$withval" = "yes"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(DBASE,1)
+ DBASE_LIB=dbase/libdbf.a
+ else
+ AC_MSG_RESULT(no)
+ AC_DEFINE(DBASE,0)
+ DBASE_LIB=
+ fi
+],[
+ AC_MSG_RESULT(no)
+ AC_DEFINE(DBASE,0)
+ DBASE_LIB=
+])
+AC_SUBST(DBASE_LIB)
+
+
+AC_MSG_CHECKING(whether to include the bundled filePro support)
+AC_ARG_WITH(filepro,
+[ --with-filepro Include the bundled read-only filePro support],[
+ if test "$withval" = "yes"; then
+ AC_DEFINE(HAVE_FILEPRO, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(HAVE_FILEPRO, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(HAVE_FILEPRO, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+AC_MSG_CHECKING(whether to enable DAV support through mod_dav)
+AC_ARG_WITH(mod-dav,
+[ --with-mod-dav=DIR Include DAV support through Apache's mod_dav,
+ DIR is mod_dav's installation directory (Apache
+ module version only!)],
+[
+ if test "$withval" = "yes"; then
+ AC_MSG_ERROR(Must give parameter to --with-mod-dav!)
+ else
+ if test "$withval" != "no"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_MOD_DAV, 1)
+ MOD_DAV_CFLAGS="-DHAVE_MOD_DAV -I$withval"
+ INCLUDES="$INCLUDES -I$withval"
+ else
+ AC_MSG_RESULT(no)
+ AC_DEFINE(HAVE_MOD_DAV, 0)
+ fi
+ fi
+],[
+ AC_MSG_RESULT(no)
+ AC_DEFINE(HAVE_MOD_DAV, 0)
+])
+AC_SUBST(MOD_DAV_CFLAGS)
+
+
+AC_MSG_CHECKING(whether to enable unified ODBC support)
+AC_ARG_ENABLE(unified-odbc,
+[ --disable-unified-odbc Disable unified ODBC support. Only applicable if
+ iODBC, Adabas, Solid, Velocis or a custom ODBC
+ interface is enabled.],
+[
+ if test "$enableval" = "no"; then
+ AC_DEFINE(HAVE_UODBC, 0)
+ AC_MSG_RESULT(no)
+ else
+ if test "$with_solid" != ""; then
+ UODBC_TYPE=solid
+ elif test "$with_iodbc" != ""; then
+ UODBC_TYPE=iodbc
+ elif test "$with_adabas" != ""; then
+ UODBC_TYPE=adabas
+ elif test "$with_velocis" != ""; then
+ UODBC_TYPE=velocis
+ elif test "$with_custom_odbc" != ""; then
+ UODBC_TYPE=custom
+ else
+ AC_MSG_ERROR([no ODBC library! Include Solid, iODBC, Velocis, Adabas D or a custom ODBC support.])
+ fi
+ AC_DEFINE(HAVE_UODBC, 1)
+ AC_MSG_RESULT([yes, using $UODBC_TYPE])
+ fi
+],[
+ if test "$UODBC_DEFAULT" = "yes"; then
+ AC_DEFINE(HAVE_UODBC, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(HAVE_UODBC, 0)
+ AC_MSG_RESULT(no)
+ fi
+])
+
+
+AC_MSG_CHECKING(whether to enable System V semaphore support)
+AC_ARG_ENABLE(sysvsem,
+[ --enable-sysvsem Enable System V semaphore support.],
+[
+ if test "$enableval" = "yes"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_SYSVSEM, 1)
+ AC_CACHE_CHECK(for union semun,php_cv_semun,
+ AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+ ],
+ [union semun x;],
+ [
+ php_cv_semun=yes
+ ],[
+ php_cv_semun=no
+ ])
+ )
+ if test $php_cv_semun = "yes"; then
+ AC_DEFINE(HAVE_SEMUN, 1)
+ else
+ AC_DEFINE(HAVE_SEMUN, 0)
+ fi
+ else
+ AC_MSG_RESULT(no)
+ AC_DEFINE(HAVE_SYSVSEM, 0)
+ fi
+],[
+ AC_MSG_RESULT(no)
+ AC_DEFINE(HAVE_SYSVSEM, 0)
+])
+
+
+AC_MSG_CHECKING(whether to enable System V shared memory support)
+AC_ARG_ENABLE(sysvshm,
+[ --enable-sysvshm Enable the System V shared memory support],[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(HAVE_SYSVSHM, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(HAVE_SYSVSHM, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(HAVE_SYSVSHM, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+divert(4)
+
+dnl If we're using gcc and the user hasn't specified CFLAGS, add -O2.
+test -n "$auto_cflags" && test -n "$GCC" && CFLAGS="$CFLAGS -O2"
+
+dnl If we're using cc on HP-UX, add the -Ae to CFLAGS
+if test -n "$auto_cflags" && test "`uname -s 2>/dev/null`" = "HP-UX"; then
+ test -n "$GCC" || CFLAGS="-Ae $CFLAGS"
+fi
+
+dnl *** Commented out - generates slow code and consumes a lot of
+dnl *** resources during compilation - we need to figure out how
+dnl *** to supply it only when absolutely necessary
+dnl If we are using gcc add -fpic to make dl() work on some platforms
+dnl test -n "$GCC" && CFLAGS="$CFLAGS -fpic"
+
+AC_SUBST(CFLAGS)
+AC_SUBST(PROG_SENDMAIL)
+AC_SUBST(CFLAGS_SHLIB)
+AC_SUBST(LDFLAGS_SHLIB)
+AC_SUBST(LDFLAGS_SHLIB_EXPORT)
+
+dnl Create the necessary directories if building using VPATH
+if test ! -d functions; then
+ mkdir functions
+fi
+
+PHP_BUILD_DATE=`date '+%Y-%m-%d'`
+AC_SUBST(PHP_BUILD_DATE)
+AC_DEFINE_UNQUOTED(PHP_BUILD_DATE,"$PHP_BUILD_DATE")
+PHP_UNAME=`uname -a`
+AC_DEFINE_UNQUOTED(PHP_UNAME,"$PHP_UNAME")
+PHP_OS=`uname`
+AC_DEFINE_UNQUOTED(PHP_OS,"$PHP_OS")
+
+AC_OUTPUT(Makefile build-defs.h libphp3.module
+ scripts/mkextlib ext/Makefile
+ regex/Makefile dbase/Makefile
+ @@EXT_MAKEFILES@@, [
+chmod +x scripts/mkextlib
+], [
+
+dnl Warn about CGI version with no extra security options.
+if test "$BINNAME" = "php"; then
+ if test "$REDIRECT" = "0"; then
+ if test "$DISCARD_PATH" = "0"; then
+ echo "WARNING: You will be compiling the CGI version of PHP without any"
+ echo " redirection checking. By putting this cgi binary somewhere"
+ echo " in your web space, users may be able to circumvent existing .htaccess"
+ echo " security by loading files directly through the parser. See"
+ echo " http://www.php.net/manual/config-security.php3 for more details."
+ fi
+ fi
+fi
+dnl Warn if Informix support was requested but environment is not set up correctly.
+if test "$INFORMIX_WARNING" != ""; then
+ echo "$INFORMIX_WARNING"
+fi
+])
+
+divert
+
+# Local Variables:
+# tab-width: 4
+# End:
diff --git a/ext/Makefile.am b/ext/Makefile.am
new file mode 100644
index 0000000000..06dc78ffc4
--- /dev/null
+++ b/ext/Makefile.am
@@ -0,0 +1,8 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = @EXT_SUBDIRS@
+
+noinst_LIBRARIES=libphpext.a
+
+libphpext.a: @EXT_LIBS@
+ $(top_srcdir)/scripts/mkextlib $@ $(SUBDIRS)
diff --git a/ext/ereg/ereg.c b/ext/ereg/ereg.c
new file mode 100644
index 0000000000..42d36493d6
--- /dev/null
+++ b/ext/ereg/ereg.c
@@ -0,0 +1,569 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ | Jim Winstead <jimw@php.net> |
+ | Jaakko Hyvätti <jaakko@hyvatti.iki.fi> |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include <stdio.h>
+#include "php.h"
+#include "php3_string.h"
+#include "reg.h"
+
+unsigned char third_argument_force_ref[] = { 3, BYREF_NONE, BYREF_NONE, BYREF_FORCE };
+
+function_entry reg_functions[] = {
+ {"ereg", php3_ereg, third_argument_force_ref },
+ {"ereg_replace", php3_eregreplace, NULL },
+ {"eregi", php3_eregi, third_argument_force_ref },
+ {"eregi_replace", php3_eregireplace, NULL },
+ {"split", php3_split, NULL},
+ {"join", php3_implode, NULL},
+ {"sql_regcase", php3_sql_regcase, NULL},
+ {NULL, NULL, NULL}
+};
+
+php3_module_entry regexp_module_entry = {
+ "Regular Expressions", reg_functions, NULL, NULL, NULL, NULL, NULL, STANDARD_MODULE_PROPERTIES
+};
+
+/* This is the maximum number of (..) constructs we'll generate from a
+ call to ereg() or eregi() with the optional third argument. */
+#define NS 10
+
+/*
+ * _php3_reg_eprint - convert error number to name
+ */
+static void _php3_reg_eprint(int err, regex_t *re) {
+ char *buf = NULL, *message = NULL;
+ size_t len;
+ size_t buf_len;
+
+#ifdef REG_ITOA
+ /* get the length of the message */
+ buf_len = regerror(REG_ITOA | err, re, NULL, 0);
+ if (buf_len) {
+ buf = (char *)emalloc(buf_len * sizeof(char));
+ if (!buf) return; /* fail silently */
+ /* finally, get the error message */
+ regerror(REG_ITOA | err, re, buf, buf_len);
+ }
+#else
+ buf_len = 0;
+#endif
+ len = regerror(err, re, NULL, 0);
+ if (len) {
+ message = (char *)emalloc((buf_len + len + 2) * sizeof(char));
+ if (!message) {
+ return; /* fail silently */
+ }
+ if (buf_len) {
+ snprintf(message, buf_len, "%s: ", buf);
+ buf_len += 1; /* so pointer math below works */
+ }
+ /* drop the message into place */
+ regerror(err, re, message + buf_len, len);
+
+ php3_error(E_WARNING, "%s", message);
+ }
+
+ STR_FREE(buf);
+ STR_FREE(message);
+}
+
+static void _php3_ereg(INTERNAL_FUNCTION_PARAMETERS, int icase)
+{
+ pval *regex, /* Regular expression */
+ *findin, /* String to apply expression to */
+ *array = NULL; /* Optional register array */
+ regex_t re;
+ regmatch_t subs[NS];
+ int err, i, match_len, string_len;
+ int copts = 0;
+ off_t start, end;
+ char *buf = NULL;
+ char *string = NULL;
+ TLS_VARS;
+
+ if (icase)
+ copts |= REG_ICASE;
+
+ switch(ARG_COUNT(ht)) {
+ case 2:
+ if (getParameters(ht, 2, &regex, &findin) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ /* don't bother doing substring matching if we're not going
+ to make use of the information */
+ copts |= REG_NOSUB;
+ break;
+ case 3:
+ if (getParameters(ht, 3, &regex, &findin, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ if (!ParameterPassedByReference(ht, 3)) {
+ php3_error(E_WARNING, "Array to be filled with values must be passed by reference.");
+ RETURN_FALSE;
+ }
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+
+
+ /* compile the regular expression from the supplied regex */
+ if (regex->type == IS_STRING) {
+ err = regcomp(&re, regex->value.str.val, REG_EXTENDED | copts);
+ } else {
+ /* we convert numbers to integers and treat them as a string */
+ if (regex->type == IS_DOUBLE)
+ convert_to_long(regex); /* get rid of decimal places */
+ convert_to_string(regex);
+ /* don't bother doing an extended regex with just a number */
+ err = regcomp(&re, regex->value.str.val, copts);
+ }
+
+ if (err) {
+ _php3_reg_eprint(err, &re);
+ RETURN_FALSE;
+ }
+
+ /* make a copy of the string we're looking in */
+ convert_to_string(findin);
+ string = estrndup(findin->value.str.val, findin->value.str.len);
+
+ /* actually execute the regular expression */
+ err = regexec(&re, string, (size_t) NS, subs, 0);
+ if (err && err != REG_NOMATCH) {
+ _php3_reg_eprint(err, &re);
+ regfree(&re);
+ RETURN_FALSE;
+ }
+ match_len = 1;
+
+ if (array && err != REG_NOMATCH) {
+ match_len = (int) (subs[0].rm_eo - subs[0].rm_so);
+ string_len = strlen(string) + 1;
+
+ buf = emalloc(string_len);
+ if (!buf) {
+ php3_error(E_WARNING, "Unable to allocate memory in _php3_ereg");
+ RETURN_FALSE;
+ }
+
+ pval_destructor(array _INLINE_TLS); /* start with clean array */
+ array_init(array);
+
+ for (i = 0; i < NS; i++) {
+ start = subs[i].rm_so;
+ end = subs[i].rm_eo;
+ if (start != -1 && end > 0 && start < string_len && end < string_len && start < end) {
+ add_index_stringl(array, i, string+start, end-start, 1);
+ }
+ }
+ efree(buf);
+ }
+
+ efree(string);
+ if (err == REG_NOMATCH) {
+ RETVAL_FALSE;
+ } else {
+ if (match_len == 0)
+ match_len = 1;
+ RETVAL_LONG(match_len);
+ }
+ regfree(&re);
+}
+
+/* {{{ proto int ereg(string pattern, string string [, array registers])
+ Regular expression match */
+void php3_ereg(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_ereg(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+
+/* {{{ proto int eregi(string pattern, string string [, array registers])
+ Case-insensitive regular expression match */
+void php3_eregi(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_ereg(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+/* }}} */
+
+/* this is the meat and potatoes of regex replacement! */
+char *_php3_regreplace(const char *pattern, const char *replace, const char *string, int icase, int extended)
+{
+ regex_t re;
+ regmatch_t subs[NS];
+
+ char *buf, /* buf is where we build the replaced string */
+ *nbuf, /* nbuf is used when we grow the buffer */
+ *walkbuf; /* used to walk buf when replacing backrefs */
+ const char *walk; /* used to walk replacement string for backrefs */
+ int buf_len;
+ int pos, tmp, string_len, new_l;
+ int err, copts = 0;
+
+ string_len = strlen(string);
+ if (!string_len)
+ return (char *)string;
+
+ if (icase)
+ copts = REG_ICASE;
+ if (extended)
+ copts |= REG_EXTENDED;
+ err = regcomp(&re, pattern, copts);
+ if (err) {
+ _php3_reg_eprint(err, &re);
+ return ((char *) -1);
+ }
+
+ /* start with a buffer that is twice the size of the stringo
+ we're doing replacements in */
+ buf_len = 2 * string_len + 1;
+ buf = emalloc(buf_len * sizeof(char));
+ if (!buf) {
+ php3_error(E_WARNING, "Unable to allocate memory in _php3_regreplace");
+ regfree(&re);
+ return ((char *) -1);
+ }
+
+ err = pos = 0;
+ buf[0] = '\0';
+
+ while (!err) {
+ err = regexec(&re, &string[pos], (size_t) NS, subs, (pos ? REG_NOTBOL : 0));
+
+ if (err && err != REG_NOMATCH) {
+ _php3_reg_eprint(err, &re);
+ regfree(&re);
+ return ((char *) -1);
+ }
+ if (!err) {
+ /* backref replacement is done in two passes:
+ 1) find out how long the string will be, and allocate buf
+ 2) copy the part before match, replacement and backrefs to buf
+
+ Jaakko Hyvätti <Jaakko.Hyvatti@iki.fi>
+ */
+
+ new_l = strlen(buf) + subs[0].rm_so; /* part before the match */
+ walk = replace;
+ while (*walk)
+ if ('\\' == *walk
+ && '0' <= walk[1] && '9' >= walk[1]
+ && subs[walk[1] - '0'].rm_so > -1
+ && subs[walk[1] - '0'].rm_eo > -1) {
+ new_l += subs[walk[1] - '0'].rm_eo
+ - subs[walk[1] - '0'].rm_so;
+ walk += 2;
+ } else {
+ new_l++;
+ walk++;
+ }
+
+ if (new_l + 1 > buf_len) {
+ buf_len = 1 + buf_len + 2 * new_l;
+ nbuf = emalloc(buf_len);
+ strcpy(nbuf, buf);
+ efree(buf);
+ buf = nbuf;
+ }
+ tmp = strlen(buf);
+ /* copy the part of the string before the match */
+ strncat(buf, &string[pos], subs[0].rm_so);
+
+ /* copy replacement and backrefs */
+ walkbuf = &buf[tmp + subs[0].rm_so];
+ walk = replace;
+ while (*walk)
+ if ('\\' == *walk
+ && '0' <= walk[1] && '9' >= walk[1]
+ && subs[walk[1] - '0'].rm_so > -1
+ && subs[walk[1] - '0'].rm_eo > -1) {
+ tmp = subs[walk[1] - '0'].rm_eo
+ - subs[walk[1] - '0'].rm_so;
+ memcpy (walkbuf,
+ &string[pos + subs[walk[1] - '0'].rm_so],
+ tmp);
+ walkbuf += tmp;
+ walk += 2;
+ } else
+ *walkbuf++ = *walk++;
+ *walkbuf = '\0';
+
+ /* and get ready to keep looking for replacements */
+ if (subs[0].rm_so == subs[0].rm_eo) {
+ if (subs[0].rm_so + pos >= string_len)
+ break;
+ new_l = strlen (buf) + 1;
+ if (new_l + 1 > buf_len) {
+ buf_len = 1 + buf_len + 2 * new_l;
+ nbuf = emalloc(buf_len * sizeof(char));
+ strcpy(nbuf, buf);
+ efree(buf);
+ buf = nbuf;
+ }
+ pos += subs[0].rm_eo + 1;
+ buf [new_l-1] = string [pos-1];
+ buf [new_l] = '\0';
+ } else {
+ pos += subs[0].rm_eo;
+ }
+ } else { /* REG_NOMATCH */
+ new_l = strlen(buf) + strlen(&string[pos]);
+ if (new_l + 1 > buf_len) {
+ buf_len = new_l + 1; /* now we know exactly how long it is */
+ nbuf = emalloc(buf_len * sizeof(char));
+ strcpy(nbuf, buf);
+ efree(buf);
+ buf = nbuf;
+ }
+ /* stick that last bit of string on our output */
+ strcat(buf, &string[pos]);
+ }
+ }
+
+ /* don't want to leak memory .. */
+ regfree(&re);
+
+ /* whew. */
+ return (buf);
+}
+
+static void _php3_eregreplace(INTERNAL_FUNCTION_PARAMETERS, int icase)
+{
+ pval *arg_pattern,
+ *arg_replace,
+ *arg_string;
+ char *pattern;
+ char *string;
+ char *replace;
+ char *ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg_pattern, &arg_replace, &arg_string) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ if (arg_pattern->type == IS_STRING) {
+ if (arg_pattern->value.str.val && arg_pattern->value.str.len)
+ pattern = estrndup(arg_pattern->value.str.val,arg_pattern->value.str.len);
+ else
+ pattern = empty_string;
+ } else {
+ convert_to_long(arg_pattern);
+ pattern = emalloc(2);
+ pattern[0] = (char) arg_pattern->value.lval;
+ pattern[1] = '\0';
+ }
+
+ if (arg_replace->type == IS_STRING) {
+ if (arg_replace->value.str.val && arg_replace->value.str.len)
+ replace = estrndup(arg_replace->value.str.val, arg_replace->value.str.len);
+ else
+ replace = empty_string;
+ } else {
+ convert_to_long(arg_replace);
+ replace = emalloc(2);
+ replace[0] = (char) arg_replace->value.lval;
+ replace[1] = '\0';
+ }
+
+ convert_to_string(arg_string);
+ if (arg_string->value.str.val && arg_string->value.str.len)
+ string = estrndup(arg_string->value.str.val, arg_string->value.str.len);
+ else
+ string = empty_string;
+
+ /* do the actual work */
+ ret = _php3_regreplace(pattern, replace, string, icase, 1);
+ if (ret == (char *) -1) {
+ RETVAL_FALSE;
+ } else {
+ RETVAL_STRING(ret,1);
+ STR_FREE(ret);
+ }
+ STR_FREE(string);
+ STR_FREE(replace);
+ STR_FREE(pattern);
+}
+
+/* {{{ proto string ereg_replace(string pattern, string string [, array registers])
+ Replace regular expression */
+void php3_eregreplace(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_eregreplace(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+
+/* {{{ proto string eregi_replace(string pattern, string string [, array registers])
+ Case insensitive replace regular expression */
+void php3_eregireplace(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_eregreplace(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+/* }}} */
+
+/* ("root", "passwd", "uid", "gid", "other:stuff:like:/bin/sh")
+ = split(":", $passwd_file, 5); */
+/* {{{ proto array split(string pattern, string string [, int limit])
+ split string into array by regular expression */
+void php3_split(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *spliton, *str, *arg_count = NULL;
+ regex_t re;
+ regmatch_t subs[1];
+ char *strp, *endp;
+ int err, size, count;
+ TLS_VARS;
+
+ switch (ARG_COUNT(ht)) {
+ case 2:
+ if (getParameters(ht, 2, &spliton, &str) == FAILURE)
+ WRONG_PARAM_COUNT;
+ count = -1;
+ break;
+ case 3:
+ if (getParameters(ht, 3, &spliton, &str, &arg_count) == FAILURE)
+ WRONG_PARAM_COUNT;
+ convert_to_long(arg_count);
+ count = arg_count->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(spliton);
+ convert_to_string(str);
+
+ strp = str->value.str.val;
+ endp = str->value.str.val + strlen(str->value.str.val);
+
+ err = regcomp(&re, spliton->value.str.val, REG_EXTENDED);
+ if (err) {
+ php3_error(E_WARNING, "unexpected regex error (%d)", err);
+ RETURN_FALSE;
+ }
+
+ if (array_init(return_value) == FAILURE) {
+ regfree(&re);
+ RETURN_FALSE;
+ }
+
+ /* churn through str, generating array entries as we go */
+ while ((count == -1 || count > 1) && !(err = regexec(&re, strp, 1, subs, 0))) {
+ if (subs[0].rm_so == 0 && subs[0].rm_eo) {
+ /* match is at start of string, return empty string */
+ add_next_index_stringl(return_value, empty_string, 0, 1);
+ /* skip ahead the length of the regex match */
+ strp+=subs[0].rm_eo;
+ } else if (subs[0].rm_so==0 && subs[0].rm_eo==0) {
+ /* No more matches */
+ regfree(&re);
+ php3_error(E_WARNING, "bad regular expression for split()");
+ _php3_hash_destroy(return_value->value.ht);
+ efree(return_value->value.ht);
+ RETURN_FALSE;
+ } else {
+ /* On a real match */
+
+ /* make a copy of the substring */
+ size = subs[0].rm_so;
+
+ /* add it to the array */
+ add_next_index_stringl(return_value, strp, size, 1);
+
+ /* point at our new starting point */
+ strp = strp + subs[0].rm_eo;
+ }
+
+ /* if we're only looking for a certain number of points,
+ stop looking once we hit it */
+ if (count != -1) count--;
+ }
+
+ /* see if we encountered an error */
+ if (err && err != REG_NOMATCH) {
+ php3_error(E_WARNING, "unexpected regex error (%d)", err);
+ regfree(&re);
+ _php3_hash_destroy(return_value->value.ht);
+ efree(return_value->value.ht);
+ RETURN_FALSE;
+ }
+
+ /* otherwise we just have one last element to add to the array */
+ size = endp - strp;
+
+ add_next_index_stringl(return_value, strp, size, 1);
+
+ regfree(&re);
+
+ return;
+}
+/* }}} */
+
+/* {{{ proto string sql_regcase(string string)
+ Make regular expression for case insensitive match */
+PHPAPI void php3_sql_regcase(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *string;
+ char *tmp;
+ register int i;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &string)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(string);
+
+ tmp = (char *) emalloc(string->value.str.len*4+1);
+
+ for (i=0; i<string->value.str.len; i++) {
+ tmp[i*4] = '[';
+ tmp[i*4+1]=toupper((unsigned char)string->value.str.val[i]);
+ tmp[i*4+2]=tolower((unsigned char)string->value.str.val[i]);
+ tmp[i*4+3]=']';
+ }
+ tmp[string->value.str.len*4]=0;
+
+ return_value->value.str.val = tmp;
+ return_value->value.str.len = string->value.str.len*4;
+ return_value->type = IS_STRING;
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/ereg/php_ereg.h b/ext/ereg/php_ereg.h
new file mode 100644
index 0000000000..bb33aa768f
--- /dev/null
+++ b/ext/ereg/php_ereg.h
@@ -0,0 +1,48 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _REG_H
+#define _REG_H
+
+extern php3_module_entry regexp_module_entry;
+#define regexp_module_ptr &regexp_module_entry
+
+extern char *_php3_regreplace(const char *pattern, const char *replace, const char *string, int icase, int extended);
+
+extern void php3_ereg(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_eregi(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_eregireplace(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_eregreplace(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_split(INTERNAL_FUNCTION_PARAMETERS);
+extern PHPAPI void php3_sql_regcase(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _REG_H */
diff --git a/ext/gd/Makefile.am b/ext/gd/Makefile.am
new file mode 100644
index 0000000000..b2deac251d
--- /dev/null
+++ b/ext/gd/Makefile.am
@@ -0,0 +1,4 @@
+## Process this file with automake to produce Makefile.in
+INCLUDES=@INCLUDES@ -I@top_srcdir@ -I@top_srcdir@/libzend
+noinst_LIBRARIES=libphpext_gd.a
+libphpext_gd_a_SOURCES=gd.c gdcache.c gdttf.c
diff --git a/ext/gd/config.m4 b/ext/gd/config.m4
new file mode 100644
index 0000000000..16fdbd2bd1
--- /dev/null
+++ b/ext/gd/config.m4
@@ -0,0 +1,54 @@
+AC_MSG_CHECKING(whether to include GD support)
+AC_ARG_WITH(gd,
+[ --without-gd Disable GD support.
+ --with-gd[=DIR] Include GD support (DIR is GD's install dir).],
+[
+ case "$withval" in
+ no)
+ AC_MSG_RESULT(no) ;;
+ yes)
+ GD_LIBS="-lgd"
+ AC_DEFINE(HAVE_LIBGD)
+ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(gd, gdImageString16, [ AC_DEFINE(HAVE_LIBGD13) ])
+ ac_cv_lib_gd_gdImageLine=yes
+ ;;
+ *)
+dnl A whole whack of possible places where this might be
+ test -f $withval/include/gd1.3/gd.h && GD_INCLUDE="-I$withval/include/gd1.3"
+ test -f $withval/include/gd/gd.h && GD_INCLUDE="-I$withval/include/gd"
+ test -f $withval/include/gd.h && GD_INCLUDE="-I$withval/include"
+ test -f $withval/gd1.3/gd.h && GD_INCLUDE="-I$withval/gd1.3"
+ test -f $withval/gd/gd.h && GD_INCLUDE="-I$withval/gd"
+ test -f $withval/gd.h && GD_INCLUDE="-I$withval"
+
+ test -f $withval/lib/libgd.a && GD_LIB="$withval/lib"
+ test -f $withval/lib/gd/libgd.a && GD_LIB="$withval/lib/gd"
+ test -f $withval/lib/gd1.3/libgd.a && GD_LIB="$withval/lib/gd1.3"
+ test -f $withval/libgd.a && GD_LIB="$withval"
+ test -f $withval/gd/libgd.a && GD_LIB="$withval/gd"
+ test -f $withval/gd1.3/libgd.a && GD_LIB="$withval/gd1.3"
+
+ if test -n "$GD_INCLUDE" && test -n "$GD_LIB" ; then
+ GD_LIBS="-L$GD_LIB -lgd"
+ AC_DEFINE(HAVE_LIBGD)
+ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(gd, gdImageString16, [ AC_DEFINE(HAVE_LIBGD13) ])
+ ac_cv_lib_gd_gdImageLine=yes
+ else
+ AC_MSG_RESULT(no)
+ fi ;;
+ esac
+],[
+ AC_CHECK_LIB(gd, gdImageLine)
+ AC_CHECK_LIB(gd, gdImageString16, [ AC_DEFINE(HAVE_LIBGD13) ])
+])
+if test "$ac_cv_lib_gd_gdImageLine" = "yes"; then
+ if test -f /usr/pkg/include/gd/gd.h -a -z "$GD_INCLUDE" ; then
+ GD_INCLUDE="-I/usr/pkg/include/gd"
+ fi
+ AC_CHECK_LIB(ttf, TT_Open_Face)
+ PHP_EXTENSION(gd)
+ LIBS="$LIBS $GD_LIBS"
+ INCLUDE="$INCLUDE $GD_INCLUDE"
+fi
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index 5edcc9ade1..32a980254f 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -39,7 +39,7 @@
# include "tls.h"
#endif
#include "php.h"
-#include "head.h"
+#include "functions/head.h"
#include <math.h>
#include "php3_gd.h"
diff --git a/ext/gd/php3_gd.h b/ext/gd/php3_gd.h
new file mode 100644
index 0000000000..d65213f9ef
--- /dev/null
+++ b/ext/gd/php3_gd.h
@@ -0,0 +1,102 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ | Stig Bakken <ssb@guardian.no> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _PHP3_GD_H
+#define _PHP3_GD_H
+
+#if COMPILE_DL
+#undef HAVE_LIBGD
+#define HAVE_LIBGD 1
+#endif
+
+#if HAVE_LIBGD
+
+#include <gd.h>
+
+extern php3_module_entry gd_module_entry;
+#define gd_module_ptr &gd_module_entry
+
+/* gd.c functions */
+extern void php3_info_gd(void);
+extern int php3_minit_gd(INIT_FUNC_ARGS);
+extern int php3_mend_gd(void);
+extern int gdImageColorResolve(gdImagePtr, int, int, int);
+extern void php3_imagearc(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagechar(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecharup(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecolorallocate(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecolorat(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecolorclosest(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecolordeallocate(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecolorresolve(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecolorexact(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecolorset(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecolorstotal(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecolorsforindex(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecolortransparent(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecopy(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecopyresized(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecreate(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagecreatefromgif (INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagedestroy(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagefill(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagefilledpolygon(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagefilledrectangle(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagefilltoborder(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagefontwidth(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagefontheight(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagegif (INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imageinterlace(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imageline(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imageloadfont(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagepolygon(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagerectangle(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagesetpixel(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagestring(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagestringup(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagesxfn(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagesyfn(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_free_gd_font(gdFontPtr);
+extern void _php3_gdimagecharup(gdImagePtr, gdFontPtr, int, int, int, int);
+extern void php3_imagedashedline(INTERNAL_FUNCTION_PARAMETERS);
+#ifdef HAVE_LIBTTF
+extern void php3_imagettfbbox(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_imagettftext(INTERNAL_FUNCTION_PARAMETERS);
+#endif
+#else
+
+#define gd_module_ptr NULL
+
+#endif
+
+#endif /* _PHP3_GD_H */
diff --git a/ext/gd/setup.stub b/ext/gd/setup.stub
new file mode 100644
index 0000000000..64668ae0fb
--- /dev/null
+++ b/ext/gd/setup.stub
@@ -0,0 +1,6 @@
+define_option with-gd 'GD support?' yesnodir \
+ "yes /usr GD install" \
+' Whether to include GD support. If PHP can find the GD libraries\n
+ on your system, it will be included automatically. You should enter\n
+ something here if you do not want to include GD support or if you\n
+ have installed GD in some unusual directory.'
diff --git a/ext/standard/Makefile.am b/ext/standard/Makefile.am
new file mode 100644
index 0000000000..0a7617147b
--- /dev/null
+++ b/ext/standard/Makefile.am
@@ -0,0 +1,11 @@
+## Process this file with automake to produce Makefile.in
+INCLUDES=@INCLUDES@ -I@top_srcdir@ -I@top_srcdir@/libzend -I@top_srcdir@/functions
+noinst_LIBRARIES=libphpext_standard.a
+libphpext_standard_a_SOURCES=\
+ base64.c basic_functions.c browscap.c datetime.c dir.c \
+ dns.c exec.c file.c filestat.c formatted_print.c fsock.c \
+ html.c image.c info.c link.c mail.c math.c md5.c microtime.c \
+ 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
+
diff --git a/ext/standard/base64.c b/ext/standard/base64.c
new file mode 100644
index 0000000000..392f2451ac
--- /dev/null
+++ b/ext/standard/base64.c
@@ -0,0 +1,197 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Author: Jim Winstead (jimw@php.net) |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include <string.h>
+
+#include "php.h"
+#include "base64.h"
+
+static char base64_table[] =
+ { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0'
+ };
+static char base64_pad = '=';
+
+unsigned char *_php3_base64_encode(const unsigned char *string, int length, int *ret_length) {
+ const unsigned char *current = string;
+ int i = 0;
+ unsigned char *result = (unsigned char *)emalloc(((length + 3 - length % 3) * 4 / 3 + 1) * sizeof(char));
+
+ while (length > 2) { /* keep going until we have less than 24 bits */
+ result[i++] = base64_table[current[0] >> 2];
+ result[i++] = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
+ result[i++] = base64_table[((current[1] & 0x0f) << 2) + (current[2] >> 6)];
+ result[i++] = base64_table[current[2] & 0x3f];
+
+ current += 3;
+ length -= 3; /* we just handle 3 octets of data */
+ }
+
+ /* now deal with the tail end of things */
+ if (length != 0) {
+ result[i++] = base64_table[current[0] >> 2];
+ if (length > 1) {
+ result[i++] = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)];
+ result[i++] = base64_table[(current[1] & 0x0f) << 2];
+ result[i++] = base64_pad;
+ }
+ else {
+ result[i++] = base64_table[(current[0] & 0x03) << 4];
+ result[i++] = base64_pad;
+ result[i++] = base64_pad;
+ }
+ }
+ if(ret_length) {
+ *ret_length = i;
+ }
+ result[i] = '\0';
+ return result;
+}
+
+/* as above, but backwards. :) */
+unsigned char *_php3_base64_decode(const unsigned char *string, int length, int *ret_length) {
+ const unsigned char *current = string;
+ int ch, i = 0, j = 0, k;
+
+ unsigned char *result = (unsigned char *)emalloc((length / 4 * 3 + 1) * sizeof(char));
+ if (result == NULL) {
+ return NULL;
+ }
+
+ /* run through the whole string, converting as we go */
+ while ((ch = *current++) != '\0') {
+ if (ch == base64_pad) break;
+ ch = (int)strchr(base64_table, ch);
+ if (ch == 0) {
+ efree(result);
+ return NULL;
+ }
+ ch -= (int)base64_table;
+
+ switch(i % 4) {
+ case 0:
+ result[j] = ch << 2;
+ break;
+ case 1:
+ result[j++] |= ch >> 4;
+ result[j] = (ch & 0x0f) << 4;
+ break;
+ case 2:
+ result[j++] |= ch >>2;
+ result[j] = (ch & 0x03) << 6;
+ break;
+ case 3:
+ result[j++] |= ch;
+ break;
+ }
+ i++;
+ }
+
+ k = j;
+ /* mop things up if we ended on a boundary */
+ if (ch == base64_pad) {
+ switch(i % 4) {
+ case 0:
+ case 1:
+ efree(result);
+ return NULL;
+ case 2:
+ k++;
+ case 3:
+ result[k++] = 0;
+ }
+ }
+ if(ret_length) {
+ *ret_length = j;
+ }
+ result[k] = '\0';
+ return result;
+}
+
+/* {{{ proto string base64_encode(string str)
+ Encodes string using MIME base64 algorithm */
+void php3_base64_encode(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *string;
+ unsigned char *result;
+ int ret_length;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht,1,&string) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(string);
+ result = _php3_base64_encode(string->value.str.val, string->value.str.len, &ret_length);
+ if (result != NULL) {
+ return_value->value.str.val = result;
+ return_value->value.str.len = ret_length;
+ return_value->type = IS_STRING;
+ } else {
+ RETURN_FALSE;
+ }
+}
+/* }}} */
+
+
+/* {{{ proto string base64_decode(string str)
+ Decodes string using MIME base64 algorithm */
+void php3_base64_decode(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *string;
+ unsigned char *result;
+ int ret_length;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht,1,&string) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(string);
+ result = _php3_base64_decode(string->value.str.val, string->value.str.len, &ret_length);
+ if (result != NULL) {
+ return_value->value.str.val = result;
+ return_value->value.str.len = ret_length;
+ return_value->type = IS_STRING;
+ } else {
+ RETURN_FALSE;
+ }
+}
+/* }}} */
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/base64.h b/ext/standard/base64.h
new file mode 100644
index 0000000000..9dc2312551
--- /dev/null
+++ b/ext/standard/base64.h
@@ -0,0 +1,47 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Author: Jim Winstead (jimw@php.net) |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+
+#ifndef _BASE64_h
+#define _BASE64_h
+
+extern void php3_base64_decode(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_base64_encode(INTERNAL_FUNCTION_PARAMETERS);
+
+extern unsigned char *_php3_base64_encode(const unsigned char *, int, int *);
+extern unsigned char *_php3_base64_decode(const unsigned char *, int, int *);
+
+#endif /* _BASE64_h */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
new file mode 100644
index 0000000000..5b7b807024
--- /dev/null
+++ b/ext/standard/basic_functions.c
@@ -0,0 +1,2153 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Andi Gutmans <andi@zend.com> |
+ | Zeev Suraski <zeev@zend.com> |
+ +----------------------------------------------------------------------+
+ */
+
+
+#define HASH_OF(p) ((p)->type==IS_ARRAY ? (p)->value.ht : (((p)->type==IS_OBJECT ? (p)->value.obj.properties : NULL)))
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "php_ini.h"
+#include "internal_functions_registry.h"
+#include "php3_standard.h"
+#include "zend_operators.h"
+#include <stdarg.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+#include <stdio.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if HAVE_STRING_H
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+#include "safe_mode.h"
+/*
+#include "functions/basic_functions.h"
+#include "functions/phpmath.h"
+#include "functions/php3_string.h"
+#include "functions/dns.h"
+#include "functions/md5.h"
+#include "functions/html.h"
+#include "functions/post.h"
+#include "functions/exec.h"
+#include "functions/info.h"
+#include "functions/url.h"
+#include "functions/datetime.h"
+#include "functions/fsock.h"
+#include "functions/image.h"
+#include "functions/php3_link.h"
+#include "functions/php3_filestat.h"
+#include "functions/microtime.h"
+#include "functions/pageinfo.h"
+#include "functions/uniqid.h"
+#include "functions/base64.h"
+#include "functions/php3_mail.h"
+#include "functions/php3_var.h"
+#include "functions/php3_iptc.h"
+#include "functions/quot_print.h"
+#include "functions/cyr_convert.h"
+*/
+#if WIN32|WINNT
+#include "win32/unistd.h"
+#endif
+#include "zend_globals.h"
+
+#include "php_globals.h"
+
+static unsigned char second_and_third_args_force_ref[] = { 3, BYREF_NONE, BYREF_FORCE, BYREF_FORCE };
+static unsigned char third_and_fourth_args_force_ref[] = { 4, BYREF_NONE, BYREF_NONE, BYREF_FORCE, BYREF_FORCE };
+static pval *user_compare_func_name;
+static HashTable *user_shutdown_function_names;
+
+/* some prototypes for local functions */
+void user_shutdown_function_dtor(pval *user_shutdown_function_name);
+int user_shutdown_function_executor(pval *user_shutdown_function_name);
+void php3_call_shutdown_functions(void);
+
+function_entry basic_functions[] = {
+ {"intval", int_value, NULL},
+ {"doubleval", double_value, NULL},
+ {"strval", string_value, NULL},
+ PHP_FE(define, NULL)
+ PHP_FE(defined, NULL)
+ {"short_tags", php3_toggle_short_open_tag, NULL},
+ {"sleep", php3_sleep, NULL},
+ {"usleep", php3_usleep, NULL},
+ {"ksort", php3_key_sort, first_arg_force_ref},
+ {"asort", php3_asort, first_arg_force_ref},
+ {"arsort", php3_arsort, first_arg_force_ref},
+ {"sort", php3_sort, first_arg_force_ref},
+ {"rsort", php3_rsort, first_arg_force_ref},
+ {"usort", php3_user_sort, first_arg_force_ref},
+ {"uasort", php3_auser_sort, first_arg_force_ref},
+ {"uksort", php3_user_key_sort, first_arg_force_ref},
+ {"array_walk", php3_array_walk, first_arg_force_ref},
+ {"sizeof", php3_count, first_arg_allow_ref},
+ {"count", php3_count, first_arg_allow_ref},
+ {"time", php3_time, NULL},
+ {"mktime", php3_mktime, NULL},
+ {"gmmktime", php3_gmmktime, NULL},
+#if HAVE_STRFTIME
+ {"strftime", php3_strftime, NULL},
+#endif
+ {"date", php3_date, NULL},
+ {"gmdate", php3_gmdate, NULL},
+ {"getdate", php3_getdate, NULL},
+ {"checkdate", php3_checkdate, NULL},
+ {"chr", php3_chr, NULL},
+ {"ord", php3_ord, NULL},
+ {"flush", php3_flush, NULL},
+ {"end", array_end, first_arg_force_ref},
+ {"prev", array_prev, first_arg_force_ref},
+ {"next", array_next, first_arg_force_ref},
+ {"reset", array_reset, first_arg_force_ref},
+ {"current", array_current, first_arg_force_ref},
+ {"key", array_current_key, first_arg_force_ref},
+ {"each", array_each, first_arg_force_ref},
+ {"gettype", php3_gettype, NULL},
+ {"settype", php3_settype, first_arg_force_ref},
+ {"min", php3_min, NULL},
+ {"max", php3_max, NULL},
+
+ {"addslashes", php3_addslashes, NULL},
+ {"chop", php3_chop, NULL},
+ {"str_replace", php3_str_replace, NULL},
+ {"chunk_split", php3_chunk_split, NULL},
+ {"trim", php3_trim, NULL},
+ {"ltrim", php3_ltrim, NULL},
+ {"rtrim", php3_chop, NULL},
+ {"pos", array_current, first_arg_force_ref},
+
+ {"fsockopen", php3_fsockopen, third_and_fourth_args_force_ref},
+ {"getimagesize", php3_getimagesize, NULL},
+ {"htmlspecialchars", php3_htmlspecialchars, NULL},
+ {"htmlentities", php3_htmlentities, NULL},
+ {"md5", php3_md5, NULL},
+
+ {"iptcparse", php3_iptcparse, NULL},
+ {"parse_url", php3_parse_url, NULL},
+
+ {"parse_str", php3_parsestr, NULL},
+ {"phpinfo", php3_info, NULL},
+ {"phpversion", php3_version, NULL},
+ {"strlen", php3_strlen, NULL},
+ {"strcmp", php3_strcmp, NULL},
+ {"strspn", php3_strspn, NULL},
+ {"strcspn", php3_strcspn, NULL},
+ {"strcasecmp", php3_strcasecmp, NULL},
+ {"strtok", php3_strtok, NULL},
+ {"strtoupper", php3_strtoupper, NULL},
+ {"strtolower", php3_strtolower, NULL},
+ {"strchr", php3_strstr, NULL},
+ {"strpos", php3_strpos, NULL},
+ {"strrpos", php3_strrpos, NULL},
+ {"strrev", php3_strrev, NULL},
+ {"hebrev", php3_hebrev, NULL},
+ {"hebrevc", php3_hebrev_with_conversion,NULL},
+ {"nl2br", php3_newline_to_br, NULL},
+ {"basename", php3_basename, NULL},
+ {"dirname", php3_dirname, NULL},
+ {"stripslashes", php3_stripslashes, NULL},
+ {"strstr", php3_strstr, NULL},
+ {"stristr", php3_stristr, NULL},
+ {"strrchr", php3_strrchr, NULL},
+ {"substr", php3_substr, NULL},
+ {"quotemeta", php3_quotemeta, NULL},
+ {"urlencode", php3_urlencode, NULL},
+ {"urldecode", php3_urldecode, NULL},
+ {"rawurlencode", php3_rawurlencode, NULL},
+ {"rawurldecode", php3_rawurldecode, NULL},
+ {"ucfirst", php3_ucfirst, NULL},
+ {"ucwords", php3_ucwords, NULL},
+ {"strtr", php3_strtr, NULL},
+ {"sprintf", php3_user_sprintf, NULL},
+ {"printf", php3_user_printf, NULL},
+ {"setlocale", php3_setlocale, NULL},
+
+ {"exec", php3_exec, second_and_third_args_force_ref},
+ {"system", php3_system, second_arg_force_ref},
+ {"escapeshellcmd", php3_escapeshellcmd, NULL},
+ {"passthru", php3_passthru, second_arg_force_ref},
+ PHP_FE(shell_exec, NULL)
+
+ {"soundex", soundex, NULL},
+
+ {"rand", php3_rand, NULL},
+ {"srand", php3_srand, NULL},
+ {"getrandmax", php3_getrandmax, NULL},
+ {"mt_rand", php3_mt_rand, NULL},
+ {"mt_srand", php3_mt_srand, NULL},
+ {"mt_getrandmax", php3_mt_getrandmax, NULL},
+ {"gethostbyaddr", php3_gethostbyaddr, NULL},
+ {"gethostbyname", php3_gethostbyname, NULL},
+ {"gethostbynamel", php3_gethostbynamel, NULL},
+#if !(WIN32|WINNT)||HAVE_BINDLIB
+ {"checkdnsrr", php3_checkdnsrr, NULL},
+ {"getmxrr", php3_getmxrr, second_and_third_args_force_ref},
+#endif
+ {"explode", php3_explode, NULL},
+ {"implode", php3_implode, NULL},
+ {"getenv", php3_getenv, NULL},
+ {"error_reporting", php3_error_reporting, NULL},
+ {"clearstatcache", php3_clearstatcache, NULL},
+
+ {"unlink", php3_unlink, NULL},
+
+ {"getmyuid", php3_getmyuid, NULL},
+ {"getmypid", php3_getmypid, NULL},
+ /*getmyiid is here for forward compatibility with 3.1
+ See pageinfo.c in 3.1 for more information*/
+ {"getmyiid", php3_getmypid, NULL},
+ {"getmyinode", php3_getmyinode, NULL},
+ {"getlastmod", php3_getlastmod, NULL},
+
+ {"base64_decode", php3_base64_decode, NULL},
+ {"base64_encode", php3_base64_encode, NULL},
+
+ {"abs", php3_abs, NULL},
+ {"ceil", php3_ceil, NULL},
+ {"floor", php3_floor, NULL},
+ {"round", php3_round, NULL},
+ {"sin", php3_sin, NULL},
+ {"cos", php3_cos, NULL},
+ {"tan", php3_tan, NULL},
+ {"asin", php3_asin, NULL},
+ {"acos", php3_acos, NULL},
+ {"atan", php3_atan, NULL},
+ {"atan2", php3_atan2, NULL},
+ {"pi", php3_pi, NULL},
+ {"pow", php3_pow, NULL},
+ {"exp", php3_exp, NULL},
+ {"log", php3_log, NULL},
+ {"log10", php3_log10, NULL},
+ {"sqrt", php3_sqrt, NULL},
+ {"deg2rad", php3_deg2rad, NULL},
+ {"rad2deg", php3_rad2deg, NULL},
+ {"bindec", php3_bindec, NULL},
+ {"hexdec", php3_hexdec, NULL},
+ {"octdec", php3_octdec, NULL},
+ {"decbin", php3_decbin, NULL},
+ {"decoct", php3_decoct, NULL},
+ {"dechex", php3_dechex, NULL},
+ {"base_convert",php3_base_convert, NULL},
+ {"number_format", php3_number_format, NULL},
+
+#if HAVE_PUTENV
+ {"putenv", php3_putenv, NULL},
+#endif
+ {"microtime", php3_microtime, NULL},
+ {"uniqid", php3_uniqid, NULL},
+ {"linkinfo", php3_linkinfo, NULL},
+ {"readlink", php3_readlink, NULL},
+ {"symlink", php3_symlink, NULL},
+ {"link", php3_link, NULL},
+ {"quoted_printable_decode", php3_quoted_printable_decode, NULL},
+ {"convert_cyr_string", php3_convert_cyr_string, NULL},
+ {"get_current_user", php3_get_current_user, NULL},
+ {"set_time_limit", php3_set_time_limit, NULL},
+
+ {"get_cfg_var", php3_get_cfg_var, NULL},
+ {"magic_quotes_runtime", php3_set_magic_quotes_runtime, NULL},
+ {"set_magic_quotes_runtime", php3_set_magic_quotes_runtime, NULL},
+ {"get_magic_quotes_gpc", php3_get_magic_quotes_gpc, NULL},
+ {"get_magic_quotes_runtime", php3_get_magic_quotes_runtime, NULL},
+
+ {"is_long", php3_is_long, first_arg_allow_ref},
+ {"is_int", php3_is_long, first_arg_allow_ref},
+ {"is_integer", php3_is_long, first_arg_allow_ref},
+ {"is_float", php3_is_double, first_arg_allow_ref},
+ {"is_double", php3_is_double, first_arg_allow_ref},
+ {"is_real", php3_is_double, first_arg_allow_ref},
+ {"is_string", php3_is_string, first_arg_allow_ref},
+ {"is_array", php3_is_array, first_arg_allow_ref},
+ {"is_object", php3_is_object, first_arg_allow_ref},
+
+ {"leak", php3_leak, NULL},
+ {"error_log", php3_error_log, NULL},
+ {"call_user_func", php3_call_user_func, NULL},
+ {"call_user_method", php3_call_user_method, NULL},
+
+ PHP_FE(var_dump, NULL)
+ PHP_FE(serialize, first_arg_allow_ref)
+ PHP_FE(unserialize, first_arg_allow_ref)
+
+ PHP_FE(register_shutdown_function, NULL)
+
+ PHP_FE(highlight_file, NULL)
+ PHP_NAMED_FE(show_source, php3_highlight_file, NULL)
+ PHP_FE(highlight_string, NULL)
+
+ PHP_FE(ob_start, NULL)
+ PHP_FE(ob_end_flush, NULL)
+ PHP_FE(ob_end_clean, NULL)
+ PHP_FE(ob_get_contents, NULL)
+
+ PHP_FE(ini_get, NULL)
+ PHP_FE(ini_alter, NULL)
+ PHP_FE(ini_restore, NULL)
+
+ PHP_FE(print_r, NULL)
+
+ {NULL, NULL, NULL}
+};
+
+
+PHP_INI_BEGIN()
+ PHP_INI_ENTRY("highlight.string", "#foobar", PHP_INI_ALL, NULL, NULL)
+ PHP_INI_ENTRY("test2", "testing", PHP_INI_SYSTEM, NULL, NULL)
+PHP_INI_END()
+
+
+php3_module_entry basic_functions_module = {
+ "Basic Functions", /* extension name */
+ basic_functions, /* function list */
+ php3_minit_basic, /* process startup */
+ php3_mshutdown_basic, /* process shutdown */
+ php3_rinit_basic, /* request startup */
+ php3_rshutdown_basic, /* request shutdown */
+ NULL, /* extension info */
+ STANDARD_MODULE_PROPERTIES
+};
+
+#if HAVE_PUTENV
+static HashTable putenv_ht;
+
+static void _php3_putenv_destructor(putenv_entry *pe)
+{
+ if (pe->previous_value) {
+ putenv(pe->previous_value);
+ } else {
+# if HAVE_UNSETENV
+ unsetenv(pe->key);
+# else
+ char **env;
+
+ for (env = environ; env != NULL && *env != NULL; env++) {
+ if (!strncmp(*env,pe->key,pe->key_len) && (*env)[pe->key_len]=='=') { /* found it */
+ *env = "";
+ break;
+ }
+ }
+# endif
+ }
+ efree(pe->putenv_string);
+ efree(pe->key);
+}
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+void test_class_startup();
+
+int php3_minit_basic(INIT_FUNC_ARGS)
+{
+ TLS_VARS;
+
+ REGISTER_DOUBLE_CONSTANT("M_PI", M_PI, CONST_CS | CONST_PERSISTENT);
+ test_class_startup();
+ REGISTER_INI_ENTRIES();
+ return SUCCESS;
+}
+
+
+int php3_mshutdown_basic(SHUTDOWN_FUNC_ARGS)
+{
+ UNREGISTER_INI_ENTRIES();
+ return SUCCESS;
+}
+
+
+int php3_rinit_basic(INIT_FUNC_ARGS)
+{
+ TLS_VARS;
+ GLOBAL(strtok_string) = NULL;
+#if HAVE_PUTENV
+ if (_php3_hash_init(&putenv_ht, 1, NULL, (void (*)(void *)) _php3_putenv_destructor, 0) == FAILURE) {
+ return FAILURE;
+ }
+#endif
+ user_compare_func_name=NULL;
+ user_shutdown_function_names=NULL;
+ return SUCCESS;
+}
+
+
+int php3_rshutdown_basic(SHUTDOWN_FUNC_ARGS)
+{
+ TLS_VARS;
+ STR_FREE(GLOBAL(strtok_string));
+#if HAVE_PUTENV
+ _php3_hash_destroy(&putenv_ht);
+#endif
+ return SUCCESS;
+}
+
+/********************
+ * System Functions *
+ ********************/
+
+void php3_getenv(INTERNAL_FUNCTION_PARAMETERS)
+{
+#if FHTTPD
+ int i;
+#endif
+ pval *str;
+ char *ptr;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+
+#if FHTTPD
+ ptr=NULL;
+ if (str->type == IS_STRING && req){
+ for(i=0;i<req->nlines;i++){
+ if (req->lines[i].paramc>1){
+ if (req->lines[i].params[0]){
+ if (!strcmp(req->lines[i].params[0],
+ str->value.str.val)){
+ ptr=req->lines[i].params[1];
+ i=req->nlines;
+ }
+ }
+ }
+ }
+ }
+ if (!ptr) ptr = getenv(str->value.str.val);
+ if (ptr
+#else
+
+ if (str->type == IS_STRING &&
+#if APACHE
+ ((ptr = (char *)table_get(GLOBAL(php3_rqst)->subprocess_env, str->value.str.val)) || (ptr = getenv(str->value.str.val)))
+#endif
+#if CGI_BINARY
+ (ptr = getenv(str->value.str.val))
+#endif
+
+#if USE_SAPI
+ (ptr = GLOBAL(sapi_rqst)->getenv(GLOBAL(sapi_rqst)->scid,str->value.str.val))
+#endif
+#endif
+ ) {
+ RETURN_STRING(ptr,1);
+ }
+ RETURN_FALSE;
+}
+
+
+#if HAVE_PUTENV
+void php3_putenv(INTERNAL_FUNCTION_PARAMETERS)
+{
+
+ pval *str;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+
+ if (str->value.str.val && *(str->value.str.val)) {
+ int ret;
+ char *p,**env;
+ putenv_entry pe;
+
+ pe.putenv_string = estrndup(str->value.str.val,str->value.str.len);
+ pe.key = str->value.str.val;
+ if ((p=strchr(pe.key,'='))) { /* nullify the '=' if there is one */
+ *p='\0';
+ }
+ pe.key_len = strlen(pe.key);
+ pe.key = estrndup(pe.key,pe.key_len);
+
+ _php3_hash_del(&putenv_ht,pe.key,pe.key_len+1);
+
+ /* find previous value */
+ pe.previous_value = NULL;
+ for (env = environ; env != NULL && *env != NULL; env++) {
+ if (!strncmp(*env,pe.key,pe.key_len) && (*env)[pe.key_len]=='=') { /* found it */
+ pe.previous_value = *env;
+ break;
+ }
+ }
+
+ if ((ret=putenv(pe.putenv_string))==0) { /* success */
+ _php3_hash_add(&putenv_ht,pe.key,pe.key_len+1,(void **) &pe,sizeof(putenv_entry),NULL);
+ RETURN_TRUE;
+ } else {
+ efree(pe.putenv_string);
+ efree(pe.key);
+ RETURN_FALSE;
+ }
+ }
+}
+#endif
+
+
+void php3_error_reporting(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ int old_error_reporting;
+ ELS_FETCH();
+
+ old_error_reporting = EG(error_reporting);
+ switch (ARG_COUNT(ht)) {
+ case 0:
+ break;
+ case 1:
+ if (getParameters(ht,1,&arg) == FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_long(arg);
+ EG(error_reporting)=arg->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+
+ RETVAL_LONG(old_error_reporting);
+}
+
+void php3_toggle_short_open_tag(INTERNAL_FUNCTION_PARAMETERS)
+{
+ /* has to be implemented within Zend */
+#if 0
+ pval *value;
+ int ret;
+ TLS_VARS;
+
+ ret = php3_ini.short_open_tag;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht,1,&value) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(value);
+ php3_ini.short_open_tag = value->value.lval;
+ RETURN_LONG(ret);
+#endif
+}
+
+/*******************
+ * Basic Functions *
+ *******************/
+
+void int_value(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num, *arg_base;
+ int base;
+
+ switch(ARG_COUNT(ht)) {
+ case 1:
+ if (getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ base = 10;
+ break;
+ case 2:
+ if (getParameters(ht, 2, &num, &arg_base) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg_base);
+ base = arg_base->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_long_base(num, base);
+ *return_value = *num;
+}
+
+
+void double_value(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num);
+ *return_value = *num;
+}
+
+
+void string_value(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(num);
+ *return_value = *num;
+ pval_copy_constructor(return_value);
+}
+
+static int array_key_compare(const void *a, const void *b)
+{
+ Bucket *first;
+ Bucket *second;
+ int min, r;
+
+ first = *((Bucket **) a);
+ second = *((Bucket **) b);
+
+ if (first->arKey == NULL && second->arKey == NULL) {
+ return (first->h - second->h);
+ } else if (first->arKey == NULL) {
+ return -1;
+ } else if (second->arKey == NULL) {
+ return 1;
+ }
+ min = MIN(first->nKeyLength, second->nKeyLength);
+ if ((r = memcmp(first->arKey, second->arKey, min)) == 0) {
+ return (first->nKeyLength - second->nKeyLength);
+ } else {
+ return r;
+ }
+}
+
+
+void php3_key_sort(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array;
+ HashTable *target_hash;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Wrong datatype in ksort() call");
+ return;
+ }
+ if (!ParameterPassedByReference(ht,1)) {
+ php3_error(E_WARNING, "Array not passed by reference in call to ksort()");
+ return;
+ }
+ if (_php3_hash_sort(target_hash, array_key_compare,0) == FAILURE) {
+ return;
+ }
+ RETURN_TRUE;
+}
+
+
+/* the current implementation of count() is a definite example of what
+ * user functions should NOT look like. It's a hack, until we get
+ * unset() to work right in 3.1
+ */
+void php3_count(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array;
+ HashTable *target_hash;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ if (array->type == IS_STRING && array->value.str.val==undefined_variable_string) {
+ RETURN_LONG(0);
+ } else {
+ RETURN_LONG(1);
+ }
+ }
+
+ RETURN_LONG(_php3_hash_num_elements(target_hash));
+}
+
+
+/* Numbers are always smaller than strings int this function as it
+ * anyway doesn't make much sense to compare two different data types.
+ * This keeps it consistant and simple.
+ */
+static int array_data_compare(const void *a, const void *b)
+{
+ Bucket *f;
+ Bucket *s;
+ pval *first;
+ pval *second;
+ double dfirst, dsecond;
+
+ f = *((Bucket **) a);
+ s = *((Bucket **) b);
+
+ first = *((pval **) f->pData);
+ second = *((pval **) s->pData);
+
+ if ((first->type == IS_LONG || first->type == IS_DOUBLE) &&
+ (second->type == IS_LONG || second->type == IS_DOUBLE)) {
+ if (first->type == IS_LONG) {
+ dfirst = (double) first->value.lval;
+ } else {
+ dfirst = first->value.dval;
+ }
+ if (second->type == IS_LONG) {
+ dsecond = (double) second->value.lval;
+ } else {
+ dsecond = second->value.dval;
+ }
+ if (dfirst < dsecond) {
+ return -1;
+ } else if (dfirst == dsecond) {
+ return 0;
+ } else {
+ return 1;
+ }
+ }
+ if ((first->type == IS_LONG || first->type == IS_DOUBLE) &&
+ second->type == IS_STRING) {
+ return -1;
+ } else if ((first->type == IS_STRING) &&
+ (second->type == IS_LONG || second->type == IS_DOUBLE)) {
+ return 1;
+ }
+ if (first->type == IS_STRING && second->type == IS_STRING) {
+ return strcmp(first->value.str.val, second->value.str.val);
+ }
+ return 0; /* Anything else is equal as it can't be compared */
+}
+
+static int array_reverse_data_compare(const void *a, const void *b)
+{
+ return array_data_compare(a,b)*-1;
+}
+
+void php3_asort(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array;
+ HashTable *target_hash;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Wrong datatype in asort() call");
+ return;
+ }
+ if (!ParameterPassedByReference(ht,1)) {
+ php3_error(E_WARNING, "Array not passed by reference in call to asort()");
+ return;
+ }
+ if (_php3_hash_sort(target_hash, array_data_compare,0) == FAILURE) {
+ return;
+ }
+ RETURN_TRUE;
+}
+
+void php3_arsort(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array;
+ HashTable *target_hash;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Wrong datatype in arsort() call");
+ return;
+ }
+ if (!ParameterPassedByReference(ht,1)) {
+ php3_error(E_WARNING, "Array not passed by reference in call to arsort()");
+ return;
+ }
+ if (_php3_hash_sort(target_hash, array_reverse_data_compare,0) == FAILURE) {
+ return;
+ }
+ RETURN_TRUE;
+}
+
+void php3_sort(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array;
+ HashTable *target_hash;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Wrong datatype in sort() call");
+ return;
+ }
+ if (!ParameterPassedByReference(ht,1)) {
+ php3_error(E_WARNING, "Array not passed by reference in call to sort()");
+ return;
+ }
+ if (_php3_hash_sort(target_hash, array_data_compare,1) == FAILURE) {
+ return;
+ }
+ RETURN_TRUE;
+}
+
+void php3_rsort(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array;
+ HashTable *target_hash;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Wrong datatype in rsort() call");
+ return;
+ }
+ if (!ParameterPassedByReference(ht,1)) {
+ php3_error(E_WARNING, "Array not passed by reference in call to rsort()");
+ return;
+ }
+ if (_php3_hash_sort(target_hash, array_reverse_data_compare,1) == FAILURE) {
+ return;
+ }
+ RETURN_TRUE;
+}
+
+
+static int array_user_compare(const void *a, const void *b)
+{
+ Bucket *f;
+ Bucket *s;
+ pval *args[2];
+ pval retval;
+ CLS_FETCH();
+
+ f = *((Bucket **) a);
+ s = *((Bucket **) b);
+
+ args[0] = (pval *) f->pData;
+ args[1] = (pval *) s->pData;
+
+ if (call_user_function(CG(function_table), NULL, user_compare_func_name, &retval, 2, args)==SUCCESS) {
+ convert_to_long(&retval);
+ return retval.value.lval;
+ } else {
+ return 0;
+ }
+}
+
+
+void php3_user_sort(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array;
+ pval *old_compare_func;
+ HashTable *target_hash;
+ TLS_VARS;
+
+ old_compare_func = user_compare_func_name;
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &array, &user_compare_func_name) == FAILURE) {
+ user_compare_func_name = old_compare_func;
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Wrong datatype in usort() call");
+ user_compare_func_name = old_compare_func;
+ return;
+ }
+ convert_to_string(user_compare_func_name);
+ if (_php3_hash_sort(target_hash, array_user_compare, 1) == FAILURE) {
+ user_compare_func_name = old_compare_func;
+ return;
+ }
+ user_compare_func_name = old_compare_func;
+ RETURN_TRUE;
+}
+
+void php3_auser_sort(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array;
+ pval *old_compare_func;
+ HashTable *target_hash;
+ TLS_VARS;
+
+ old_compare_func = user_compare_func_name;
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &array, &user_compare_func_name) == FAILURE) {
+ user_compare_func_name = old_compare_func;
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Wrong datatype in uasort() call");
+ user_compare_func_name = old_compare_func;
+ return;
+ }
+ convert_to_string(user_compare_func_name);
+ if (_php3_hash_sort(target_hash, array_user_compare, 0) == FAILURE) {
+ user_compare_func_name = old_compare_func;
+ return;
+ }
+ user_compare_func_name = old_compare_func;
+ RETURN_TRUE;
+}
+
+
+static int array_user_key_compare(const void *a, const void *b)
+{
+ Bucket *f;
+ Bucket *s;
+ pval key1, key2;
+ pval *args[2];
+ pval retval;
+ int status;
+ CLS_FETCH();
+
+ args[0] = &key1;
+ args[1] = &key2;
+
+ f = *((Bucket **) a);
+ s = *((Bucket **) b);
+
+ if (f->arKey) {
+ key1.value.str.val = estrndup(f->arKey, f->nKeyLength);
+ key1.value.str.len = f->nKeyLength;
+ key1.type = IS_STRING;
+ } else {
+ key1.value.lval = f->h;
+ key1.type = IS_LONG;
+ }
+ if (s->arKey) {
+ key2.value.str.val = estrndup(s->arKey, s->nKeyLength);
+ key2.value.str.len = s->nKeyLength;
+ key2.type = IS_STRING;
+ } else {
+ key2.value.lval = s->h;
+ key2.type = IS_LONG;
+ }
+
+ status = call_user_function(CG(function_table), NULL, user_compare_func_name, &retval, 2, args);
+
+ pval_destructor(&key1);
+ pval_destructor(&key2);
+
+ if (status==SUCCESS) {
+ convert_to_long(&retval);
+ return retval.value.lval;
+ } else {
+ return 0;
+ }
+}
+
+
+void php3_user_key_sort(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array;
+ pval *old_compare_func;
+ HashTable *target_hash;
+ TLS_VARS;
+
+ old_compare_func = user_compare_func_name;
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &array, &user_compare_func_name) == FAILURE) {
+ user_compare_func_name = old_compare_func;
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Wrong datatype in uksort() call");
+ user_compare_func_name = old_compare_func;
+ return;
+ }
+ convert_to_string(user_compare_func_name);
+ if (_php3_hash_sort(target_hash, array_user_key_compare, 0) == FAILURE) {
+ user_compare_func_name = old_compare_func;
+ return;
+ }
+ user_compare_func_name = old_compare_func;
+ RETURN_TRUE;
+}
+
+
+void array_end(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array, **entry;
+ HashTable *target_hash;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Variable passed to end() is not an array or object");
+ return;
+ }
+ if (!ParameterPassedByReference(ht,1)) {
+ php3_error(E_WARNING, "Array not passed by reference in call to end()");
+ }
+ _php3_hash_internal_pointer_end(target_hash);
+ if (_php3_hash_get_current_data(target_hash, (void **) &entry) == FAILURE) {
+ RETURN_FALSE;
+ }
+ *return_value = **entry;
+ pval_copy_constructor(return_value);
+}
+
+
+void array_prev(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array, **entry;
+ HashTable *target_hash;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Variable passed to prev() is not an array or object");
+ RETURN_FALSE;
+ }
+ _php3_hash_move_backwards(target_hash);
+ if (_php3_hash_get_current_data(target_hash, (void **) &entry) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ *return_value = **entry;
+ pval_copy_constructor(return_value);
+}
+
+
+void array_next(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array, **entry;
+ HashTable *target_hash;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Variable passed to next() is not an array or object");
+ RETURN_FALSE;
+ }
+ _php3_hash_move_forward(target_hash);
+ if (_php3_hash_get_current_data(target_hash, (void **) &entry) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ *return_value = **entry;
+ pval_copy_constructor(return_value);
+}
+
+
+void array_each(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array,*entry,**entry_ptr, *tmp;
+ char *string_key;
+ ulong num_key;
+ pval **inserted_pointer;
+ HashTable *target_hash;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING,"Variable passed to each() is not an array or object");
+ return;
+ }
+ if (_php3_hash_get_current_data(target_hash, (void **) &entry_ptr)==FAILURE) {
+ RETURN_FALSE;
+ }
+ array_init(return_value);
+ entry = *entry_ptr;
+
+ /* add value elements */
+ if (entry->is_ref) {
+ tmp = (pval *)emalloc(sizeof(pval));
+ *tmp = *entry;
+ pval_copy_constructor(tmp);
+ tmp->is_ref=0;
+ tmp->refcount=0;
+ entry=tmp;
+ }
+ _php3_hash_index_update(return_value->value.ht, 1, &entry, sizeof(pval *), NULL);
+ entry->refcount++;
+ _php3_hash_update_ptr(return_value->value.ht, "value", sizeof("value"), entry, sizeof(pval *), NULL);
+ entry->refcount++;
+
+ /* add the key elements */
+ switch (_php3_hash_get_current_key(target_hash, &string_key, &num_key)) {
+ case HASH_KEY_IS_STRING:
+ add_get_index_string(return_value,0,string_key,(void **) &inserted_pointer,0);
+ break;
+ case HASH_KEY_IS_LONG:
+ add_get_index_long(return_value,0,num_key, (void **) &inserted_pointer);
+ break;
+ }
+ _php3_hash_update(return_value->value.ht, "key", sizeof("key"), inserted_pointer, sizeof(pval *), NULL);
+ (*inserted_pointer)->refcount++;
+ _php3_hash_move_forward(target_hash);
+}
+
+
+void array_reset(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array, **entry;
+ HashTable *target_hash;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Variable passed to reset() is not an array or object");
+ return;
+ }
+ _php3_hash_internal_pointer_reset(target_hash);
+ if (_php3_hash_get_current_data(target_hash, (void **) &entry) == FAILURE) {
+ return;
+ }
+
+ *return_value = **entry;
+ pval_copy_constructor(return_value);
+ return_value->refcount=1;
+ return_value->is_ref=0;
+}
+
+void array_current(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array, **entry;
+ HashTable *target_hash;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Variable passed to current() is not an array or object");
+ return;
+ }
+ if (_php3_hash_get_current_data(target_hash, (void **) &entry) == FAILURE) {
+ return;
+ }
+ *return_value = **entry;
+ pval_copy_constructor(return_value);
+}
+
+
+void array_current_key(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *array;
+ char *string_key;
+ ulong num_key;
+ HashTable *target_hash;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Variable passed to key() is not an array or object");
+ return;
+ }
+ if (!ParameterPassedByReference(ht,1)) {
+ php3_error(E_WARNING, "Array not passed by reference in call to key()");
+ }
+ switch (_php3_hash_get_current_key(target_hash, &string_key, &num_key)) {
+ case HASH_KEY_IS_STRING:
+ return_value->value.str.val = string_key;
+ return_value->value.str.len = strlen(string_key);
+ return_value->type = IS_STRING;
+ break;
+ case HASH_KEY_IS_LONG:
+ return_value->type = IS_LONG;
+ return_value->value.lval = num_key;
+ break;
+ case HASH_KEY_NON_EXISTANT:
+ return;
+ }
+}
+
+#ifdef __cplusplus
+void php3_flush(HashTable *)
+#else
+void php3_flush(INTERNAL_FUNCTION_PARAMETERS)
+#endif
+{
+#if APACHE
+ TLS_VARS;
+# if MODULE_MAGIC_NUMBER > 19970110
+ rflush(GLOBAL(php3_rqst));
+# else
+ bflush(GLOBAL(php3_rqst)->connection->client);
+# endif
+#endif
+#if FHTTPD
+ /*FIXME -- what does it flush really? the whole response?*/
+#endif
+#if CGI_BINARY
+ fflush(stdout);
+#endif
+#if USE_SAPI
+ TLS_VARS;
+ GLOBAL(sapi_rqst)->flush(GLOBAL(sapi_rqst)->scid);
+#endif
+}
+
+
+void php3_sleep(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(num);
+ sleep(num->value.lval);
+}
+
+void php3_usleep(INTERNAL_FUNCTION_PARAMETERS)
+{
+#if HAVE_USLEEP
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(num);
+ usleep(num->value.lval);
+#endif
+}
+
+void php3_gettype(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ switch (arg->type) {
+ case IS_LONG:
+ RETVAL_STRING("integer",1);
+ break;
+ case IS_DOUBLE:
+ RETVAL_STRING("double",1);
+ break;
+ case IS_STRING:
+ RETVAL_STRING("string",1);
+ break;
+ case IS_ARRAY:
+ RETVAL_STRING("array",1);
+ break;
+ case IS_OBJECT: {
+ char *result;
+ int res_len;
+
+ res_len = sizeof("object of type ")-1 + arg->value.obj.ce->name_length;
+ result = (char *) emalloc(res_len+1);
+ sprintf(result, "object of type %s", arg->value.obj.ce->name);
+ RETVAL_STRINGL(result, res_len, 0);
+ }
+ break;
+ default:
+ RETVAL_STRING("unknown type",1);
+ }
+}
+
+
+void php3_settype(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *var, *type;
+ char *new_type;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &var, &type) ==
+ FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(type);
+ new_type = type->value.str.val;
+
+ if (!strcasecmp(new_type, "integer")) {
+ convert_to_long(var);
+ } else if (!strcasecmp(new_type, "double")) {
+ convert_to_double(var);
+ } else if (!strcasecmp(new_type, "string")) {
+ convert_to_string(var);
+ } else if (!strcasecmp(new_type, "array")) {
+ convert_to_array(var);
+ } else if (!strcasecmp(new_type, "object")) {
+ convert_to_object(var);
+ } else {
+ php3_error(E_WARNING, "settype: invalid type");
+ RETURN_FALSE;
+ }
+ RETVAL_TRUE;
+}
+
+
+void php3_min(INTERNAL_FUNCTION_PARAMETERS)
+{
+ int argc=ARG_COUNT(ht);
+ pval **result;
+
+ if (argc<=0) {
+ php3_error(E_WARNING, "min: must be passed at least 1 value");
+ var_uninit(return_value);
+ return;
+ }
+ if (argc == 1) {
+ pval *arr;
+
+ if (getParameters(ht, 1, &arr) == FAILURE ||
+ arr->type != IS_ARRAY) {
+ WRONG_PARAM_COUNT;
+ }
+ if (_php3_hash_minmax(arr->value.ht, array_data_compare, 0, (void **) &result)==SUCCESS) {
+ *return_value = **result;
+ pval_copy_constructor(return_value);
+ } else {
+ php3_error(E_WARNING, "min: array must contain at least 1 element");
+ var_uninit(return_value);
+ }
+ } else {
+ if (_php3_hash_minmax(ht, array_data_compare, 0, (void **) &result)==SUCCESS) {
+ *return_value = **result;
+ pval_copy_constructor(return_value);
+ }
+ }
+}
+
+
+void php3_max(INTERNAL_FUNCTION_PARAMETERS)
+{
+ int argc=ARG_COUNT(ht);
+ pval **result;
+
+ if (argc<=0) {
+ php3_error(E_WARNING, "max: must be passed at least 1 value");
+ var_uninit(return_value);
+ return;
+ }
+ if (argc == 1) {
+ pval *arr;
+
+ if (getParameters(ht, 1, &arr) == FAILURE ||
+ arr->type != IS_ARRAY) {
+ WRONG_PARAM_COUNT;
+ }
+ if (_php3_hash_minmax(arr->value.ht, array_data_compare, 1, (void **) &result)==SUCCESS) {
+ *return_value = **result;
+ pval_copy_constructor(return_value);
+ } else {
+ php3_error(E_WARNING, "max: array must contain at least 1 element");
+ var_uninit(return_value);
+ }
+ } else {
+ if (_php3_hash_minmax(ht, array_data_compare, 1, (void **) &result)==SUCCESS) {
+ *return_value = **result;
+ pval_copy_constructor(return_value);
+ }
+ }
+}
+
+static pval *php3_array_walk_func_name;
+
+static int _php3_array_walk(const void *a)
+{
+ pval *args[1];
+ pval retval;
+ CLS_FETCH();
+
+ args[0] = (pval *)a;
+
+ call_user_function(CG(function_table), NULL, php3_array_walk_func_name, &retval, 1, args);
+ return 0;
+}
+
+void php3_array_walk(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *array, *old_walk_func_name;
+ HashTable *target_hash;
+ TLS_VARS;
+
+ old_walk_func_name = php3_array_walk_func_name;
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &array, &php3_array_walk_func_name) == FAILURE) {
+ php3_array_walk_func_name = old_walk_func_name;
+ WRONG_PARAM_COUNT;
+ }
+ target_hash = HASH_OF(array);
+ if (!target_hash) {
+ php3_error(E_WARNING, "Wrong datatype in array_walk() call");
+ php3_array_walk_func_name = old_walk_func_name;
+ return;
+ }
+ convert_to_string(php3_array_walk_func_name);
+ _php3_hash_apply(target_hash, (int (*)(void *))_php3_array_walk);
+ php3_array_walk_func_name = old_walk_func_name;
+ RETURN_TRUE;
+}
+
+#if 0
+void php3_max(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval **argv;
+ int argc, i;
+ unsigned short max_type = IS_LONG;
+ TLS_VARS;
+
+ argc = ARG_COUNT(ht);
+ /* if there is one parameter and this parameter is an array of
+ * 2 or more elements, use that array
+ */
+ if (argc == 1) {
+ argv = (pval **)emalloc(sizeof(pval *) * argc);
+ if (getParametersArray(ht, argc, argv) == FAILURE ||
+ argv[0]->type != IS_ARRAY) {
+ WRONG_PARAM_COUNT;
+ }
+ if (argv[0]->value.ht->nNumOfElements < 2) {
+ php3_error(E_WARNING,
+ "min: array must contain at least 2 elements");
+ RETURN_FALSE;
+ }
+ /* replace the function parameters with the array */
+ ht = argv[0]->value.ht;
+ argc = _php3_hash_num_elements(ht);
+ efree(argv);
+ } else if (argc < 2) {
+ WRONG_PARAM_COUNT;
+ }
+ argv = (pval **)emalloc(sizeof(pval *) * argc);
+ if (getParametersArray(ht, argc, argv) == FAILURE) {
+ efree(argv);
+ WRONG_PARAM_COUNT;
+ }
+ /* figure out what types to compare
+ * if the arguments contain a double, convert all of them to a double
+ * else convert all of them to long
+ */
+ for (i = 0; i < argc; i++) {
+ if (argv[i]->type == IS_DOUBLE) {
+ max_type = IS_DOUBLE;
+ break;
+ }
+ }
+ if (max_type == IS_LONG) {
+ convert_to_long(argv[0]);
+ return_value->value.lval = argv[0]->value.lval;
+ for (i = 1; i < argc; i++) {
+ convert_to_long(argv[i]);
+ if (argv[i]->value.lval > return_value->value.lval) {
+ return_value->value.lval = argv[i]->value.lval;
+ }
+ }
+ } else {
+ convert_to_double(argv[0]);
+ return_value->value.dval = argv[0]->value.dval;
+ for (i = 1; i < argc; i++) {
+ convert_to_double(argv[i]);
+ if (argv[i]->value.dval > return_value->value.dval) {
+ return_value->value.dval = argv[i]->value.dval;
+ }
+ }
+ }
+ efree(argv);
+ return_value->type = max_type;
+}
+#endif
+
+void php3_get_current_user(INTERNAL_FUNCTION_PARAMETERS)
+{
+ TLS_VARS;
+
+ RETURN_STRING(_php3_get_current_user(),1);
+}
+
+
+void php3_get_cfg_var(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *varname;
+ char *value;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &varname)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(varname);
+
+ if (cfg_get_string(varname->value.str.val,&value)==FAILURE) {
+ RETURN_FALSE;
+ }
+ RETURN_STRING(value,1);
+}
+
+void php3_set_magic_quotes_runtime(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *new_setting;
+ PLS_FETCH();
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &new_setting)==FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_long(new_setting);
+
+ PG(magic_quotes_runtime)=new_setting->value.lval;
+ RETURN_TRUE;
+}
+
+void php3_get_magic_quotes_runtime(INTERNAL_FUNCTION_PARAMETERS)
+{
+ PLS_FETCH();
+
+ RETURN_LONG(PG(magic_quotes_runtime));
+}
+
+void php3_get_magic_quotes_gpc(INTERNAL_FUNCTION_PARAMETERS)
+{
+ PLS_FETCH();
+
+ RETURN_LONG(PG(magic_quotes_gpc));
+}
+
+
+void php3_is_type(INTERNAL_FUNCTION_PARAMETERS,int type)
+{
+ pval *arg;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &arg)==FAILURE) {
+ RETURN_FALSE;
+ }
+ if (arg->type == type) {
+ RETURN_TRUE;
+ } else {
+ RETURN_FALSE;
+ }
+}
+
+
+void php3_is_long(INTERNAL_FUNCTION_PARAMETERS) { php3_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_LONG); }
+void php3_is_double(INTERNAL_FUNCTION_PARAMETERS) { php3_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_DOUBLE); }
+void php3_is_string(INTERNAL_FUNCTION_PARAMETERS) { php3_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_STRING); }
+void php3_is_array(INTERNAL_FUNCTION_PARAMETERS) { php3_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_ARRAY); }
+void php3_is_object(INTERNAL_FUNCTION_PARAMETERS) { php3_is_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, IS_OBJECT); }
+
+
+void php3_leak(INTERNAL_FUNCTION_PARAMETERS)
+{
+ int leakbytes=3;
+ pval *leak;
+
+ if (ARG_COUNT(ht)>=1) {
+ if (getParameters(ht, 1, &leak)==SUCCESS) {
+ convert_to_long(leak);
+ leakbytes = leak->value.lval;
+ }
+ }
+
+ emalloc(leakbytes);
+}
+
+/*
+ 1st arg = error message
+ 2nd arg = error option
+ 3rd arg = optional parameters (email address or tcp address)
+ 4th arg = used for additional headers if email
+
+ error options
+ 0 = send to php3_error_log (uses syslog or file depending on ini setting)
+ 1 = send via email to 3rd parameter 4th option = additional headers
+ 2 = send via tcp/ip to 3rd parameter (name or ip:port)
+ 3 = save to file in 3rd parameter
+*/
+
+void php3_error_log(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *string, *erropt = NULL, *option = NULL, *emailhead = NULL;
+ int opt_err = 0;
+ char *message, *opt=NULL, *headers=NULL;
+ TLS_VARS;
+
+ switch(ARG_COUNT(ht)) {
+ case 1:
+ if (getParameters(ht,1,&string) == FAILURE) {
+ php3_error(E_WARNING,"Invalid argument 1 in error_log");
+ RETURN_FALSE;
+ }
+ break;
+ case 2:
+ if (getParameters(ht,2,&string,&erropt) == FAILURE) {
+ php3_error(E_WARNING,"Invalid arguments in error_log");
+ RETURN_FALSE;
+ }
+ convert_to_long(erropt);
+ opt_err=erropt->value.lval;
+ break;
+ case 3:
+ if (getParameters(ht,3,&string,&erropt,&option) == FAILURE){
+ php3_error(E_WARNING,"Invalid arguments in error_log");
+ RETURN_FALSE;
+ }
+ convert_to_long(erropt);
+ opt_err=erropt->value.lval;
+ convert_to_string(option);
+ opt=option->value.str.val;
+ break;
+ case 4:
+ if (getParameters(ht,4,&string,&erropt,&option,&emailhead) == FAILURE){
+ php3_error(E_WARNING,"Invalid arguments in error_log");
+ RETURN_FALSE;
+ }
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(string);
+ message=string->value.str.val;
+ if (erropt != NULL) {
+ convert_to_long(erropt);
+ opt_err=erropt->value.lval;
+ }
+ if (option != NULL) {
+ convert_to_string(option);
+ opt=option->value.str.val;
+ }
+ if (emailhead != NULL) {
+ convert_to_string(emailhead);
+ headers=emailhead->value.str.val;
+ }
+
+ if (_php3_error_log(opt_err,message,opt,headers)==FAILURE) {
+ RETURN_FALSE;
+ }
+
+ RETURN_TRUE;
+}
+
+PHPAPI int _php3_error_log(int opt_err,char *message,char *opt,char *headers){
+ FILE *logfile;
+ int issock=0, socketd=0;;
+
+ switch(opt_err){
+ case 1: /*send an email*/
+ {
+#if HAVE_SENDMAIL
+ if (!_php3_mail(opt,"PHP3 error_log message",message,headers)){
+ return FAILURE;
+ }
+#else
+ php3_error(E_WARNING,"Mail option not available!");
+ return FAILURE;
+#endif
+ }
+ break;
+ case 2: /*send to an address */
+ php3_error(E_WARNING,"TCP/IP option not available!");
+ return FAILURE;
+ break;
+ case 3: /*save to a file*/
+ logfile=php3_fopen_wrapper(opt,"a", (IGNORE_URL|ENFORCE_SAFE_MODE), &issock, &socketd);
+ if(!logfile) {
+ php3_error(E_WARNING,"error_log: Unable to write to %s",opt);
+ return FAILURE;
+ }
+ fwrite(message,strlen(message),1,logfile);
+ fclose(logfile);
+ break;
+ default:
+ php3_log_err(message);
+ break;
+ }
+ return SUCCESS;
+}
+
+
+void php3_call_user_func(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval **params;
+ pval retval;
+ int arg_count=ARG_COUNT(ht);
+ CLS_FETCH();
+
+ if (arg_count<1) {
+ WRONG_PARAM_COUNT;
+ }
+ params = (pval **) emalloc(sizeof(pval)*arg_count);
+
+ if (getParametersArray(ht, arg_count, params)==FAILURE) {
+ efree(params);
+ RETURN_FALSE;
+ }
+ convert_to_string(params[0]);
+ if (call_user_function(CG(function_table), NULL, params[0], &retval, arg_count-1, params+1)==SUCCESS) {
+ *return_value = retval;
+ } else {
+ php3_error(E_WARNING,"Unable to call %s() - function does not exist", params[0]->value.str.val);
+ }
+ efree(params);
+}
+
+
+void php3_call_user_method(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval **params;
+ pval retval;
+ int arg_count=ARG_COUNT(ht);
+
+ if (arg_count<2) {
+ WRONG_PARAM_COUNT;
+ }
+ params = (pval **) emalloc(sizeof(pval)*arg_count);
+
+ if (getParametersArray(ht, arg_count, params)==FAILURE) {
+ efree(params);
+ RETURN_FALSE;
+ }
+ if (params[1]->type != IS_OBJECT) {
+ php3_error(E_WARNING,"2nd argument is not an object\n");
+ efree(params);
+ RETURN_FALSE;
+ }
+ convert_to_string(params[0]);
+ if (call_user_function(CG(function_table), params[1], params[0], &retval, arg_count-2, params+2)==SUCCESS) {
+ *return_value = retval;
+ } else {
+ php3_error(E_WARNING,"Unable to call %s() - function does not exist", params[0]->value.str.val);
+ }
+ efree(params);
+}
+
+
+void user_shutdown_function_dtor(pval *user_shutdown_function_name)
+{
+ pval retval;
+ CLS_FETCH();
+
+ if (call_user_function(CG(function_table), NULL, user_shutdown_function_name, &retval, 0, NULL)==SUCCESS) {
+ pval_destructor(&retval);
+ }
+ pval_destructor(user_shutdown_function_name);
+}
+
+
+void php3_call_shutdown_functions(void)
+{
+ if (user_shutdown_function_names) {
+ _php3_hash_destroy(user_shutdown_function_names);
+ efree(user_shutdown_function_names);
+ }
+}
+
+/* {{{ proto void register_shutdown_function(string function_name)
+ Register a user-level function to be called on request termination */
+PHP_FUNCTION(register_shutdown_function)
+{
+ pval *arg, shutdown_function_name;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &arg)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(arg);
+ if (!user_shutdown_function_names) {
+ user_shutdown_function_names = (HashTable *) emalloc(sizeof(HashTable));
+ _php3_hash_init(user_shutdown_function_names, 0, NULL, (void (*)(void *))user_shutdown_function_dtor, 0);
+ }
+
+ shutdown_function_name = *arg;
+ pval_copy_constructor(&shutdown_function_name);
+
+ _php3_hash_next_index_insert(user_shutdown_function_names, &shutdown_function_name, sizeof(pval), NULL);
+}
+/* }}} */
+
+
+void php_get_highlight_struct(zend_syntax_highlighter_ini *syntax_highlighter_ini)
+{
+ syntax_highlighter_ini->highlight_comment = INI_STR("highlight_comment");
+ syntax_highlighter_ini->highlight_default = INI_STR("highlight_default");
+ syntax_highlighter_ini->highlight_html = INI_STR("highlight_html");
+ syntax_highlighter_ini->highlight_keyword = INI_STR("highlight_keyword");
+ syntax_highlighter_ini->highlight_string = INI_STR("highlight_string");
+}
+
+
+/* {{{ proto void highlight_file(string file_name)
+ Syntax highlight a source file */
+PHP_FUNCTION(highlight_file)
+{
+ pval *filename;
+ zend_syntax_highlighter_ini syntax_highlighter_ini;
+
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &filename)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(filename);
+
+ php_get_highlight_struct(&syntax_highlighter_ini);
+
+ if (highlight_file(filename->value.str.val, &syntax_highlighter_ini)==FAILURE) {
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+}
+/* }}} */
+
+
+/* {{{ proto void highlight_file(string file_name)
+ Syntax highlight a source file */
+PHP_FUNCTION(highlight_string)
+{
+ pval *expr;
+ zend_syntax_highlighter_ini syntax_highlighter_ini;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &expr)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(expr);
+
+ php_get_highlight_struct(&syntax_highlighter_ini);
+
+ if (highlight_string(expr, &syntax_highlighter_ini)==FAILURE) {
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+}
+/* }}} */
+
+
+pval test_class_get_property(zend_property_reference *property_reference)
+{
+ pval result;
+ zend_overloaded_element *overloaded_property;
+ zend_llist_element *element;
+
+
+ printf("Reading a property from a TestClass object:\n");
+
+ for (element=property_reference->elements_list.head; element; element=element->next) {
+ overloaded_property = (zend_overloaded_element *) element->data;
+ switch (overloaded_property->type) {
+ case IS_ARRAY:
+ printf("Array offset: ");
+ break;
+ case IS_OBJECT:
+ printf("Object property: ");
+ break;
+ }
+ switch (overloaded_property->element.type) {
+ case IS_LONG:
+ printf("%d (numeric)\n", overloaded_property->element.value.lval);
+ break;
+ case IS_STRING:
+ printf("'%s'\n", overloaded_property->element.value.str.val);
+ break;
+ }
+ pval_destructor(&overloaded_property->element);
+ }
+
+ result.value.str.val = estrndup("testing", 7);
+ result.value.str.len = 7;
+ result.type = IS_STRING;
+ return result;
+}
+
+
+int test_class_set_property(zend_property_reference *property_reference, pval *value)
+{
+ zend_overloaded_element *overloaded_property;
+ zend_llist_element *element;
+
+ printf("Writing to a property from a TestClass object:\n");
+ printf("Writing '");
+ zend_print_variable(value);
+ printf("'\n");
+
+ for (element=property_reference->elements_list.head; element; element=element->next) {
+ overloaded_property = (zend_overloaded_element *) element->data;
+ switch (overloaded_property->type) {
+ case IS_ARRAY:
+ printf("Array offset: ");
+ break;
+ case IS_OBJECT:
+ printf("Object property: ");
+ break;
+ }
+ switch (overloaded_property->element.type) {
+ case IS_LONG:
+ printf("%d (numeric)\n", overloaded_property->element.value.lval);
+ break;
+ case IS_STRING:
+ printf("'%s'\n", overloaded_property->element.value.str.val);
+ break;
+ }
+ pval_destructor(&overloaded_property->element);
+ }
+
+ return 0;
+}
+
+
+
+void test_class_call_function(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference)
+{
+ zend_overloaded_element *overloaded_property;
+ zend_llist_element *element;
+
+
+ printf("Reading a property from a TestClass object:\n");
+
+ for (element=property_reference->elements_list.head; element; element=element->next) {
+ overloaded_property = (zend_overloaded_element *) element->data;
+ switch (overloaded_property->type) {
+ case IS_ARRAY:
+ printf("Array offset: ");
+ break;
+ case IS_OBJECT:
+ printf("Object property: ");
+ break;
+ case IS_METHOD:
+ printf("Overloaded method: ");
+ }
+ switch (overloaded_property->element.type) {
+ case IS_LONG:
+ printf("%d (numeric)\n", overloaded_property->element.value.lval);
+ break;
+ case IS_STRING:
+ printf("'%s'\n", overloaded_property->element.value.str.val);
+ break;
+ }
+ pval_destructor(&overloaded_property->element);
+ }
+
+ printf("%d arguments\n", zend_hash_num_elements(ht));
+ return_value->value.str.val = estrndup("testing", 7);
+ return_value->value.str.len = 7;
+ return_value->type = IS_STRING;
+}
+
+
+void test_class_startup()
+{
+ zend_class_entry class_entry;
+
+ class_entry.name = strdup("TestClass");
+ class_entry.name_length = sizeof("TestClass")-1;
+
+ class_entry.handle_property_get = test_class_get_property;
+ class_entry.handle_property_set = test_class_set_property;
+ class_entry.handle_function_call = test_class_call_function;
+ register_internal_class(&class_entry);
+}
+
+
+PHP_FUNCTION(ob_start)
+{
+ zend_start_ob_buffering();
+}
+
+
+PHP_FUNCTION(ob_end_flush)
+{
+ zend_end_ob_buffering(1);
+}
+
+
+PHP_FUNCTION(ob_end_clean)
+{
+ zend_end_ob_buffering(0);
+}
+
+
+PHP_FUNCTION(ob_get_contents)
+{
+ if (zend_ob_get_buffer(return_value)==FAILURE) {
+ RETURN_FALSE;
+ }
+}
+
+
+PHP_FUNCTION(ini_get)
+{
+ pval *varname;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &varname)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ return_value->value.str.val = php_ini_string(varname->value.str.val, varname->value.str.len+1, 0);
+
+ if (!return_value->value.str.val) {
+ RETURN_FALSE;
+ }
+
+ return_value->value.str.len = strlen(return_value->value.str.val);
+ return_value->type = IS_STRING;
+ pval_copy_constructor(return_value);
+}
+
+
+PHP_FUNCTION(ini_alter)
+{
+ pval *varname, *new_value;
+ char *old_value;
+
+ if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &varname, &new_value)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ old_value = php_ini_string(varname->value.str.val, varname->value.str.len+1, 0);
+
+
+ convert_to_string(new_value);
+
+ if (php_alter_ini_entry(varname->value.str.val, varname->value.str.len+1, new_value->value.str.val, new_value->value.str.len, PHP_INI_USER)==FAILURE) {
+ RETURN_FALSE;
+ }
+ if (old_value) {
+ RETURN_STRING(old_value, 1);
+ } else {
+ RETURN_FALSE;
+ }
+}
+
+
+
+PHP_FUNCTION(ini_restore)
+{
+ pval *varname;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &varname)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(varname);
+
+ php_restore_ini_entry(varname->value.str.val, varname->value.str.len);
+}
+
+
+PHP_FUNCTION(print_r)
+{
+ pval *expr;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &expr)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ zend_print_pval_r(expr, 0);
+ RETURN_TRUE;
+}
+
+
+/* This should go back to PHP */
+PHP_FUNCTION(define)
+{
+ pval *var, *val, *non_cs;
+ int case_sensitive;
+ zend_constant c;
+
+ switch(ARG_COUNT(ht)) {
+ case 2:
+ if (getParameters(ht, 2, &var, &val)==FAILURE) {
+ RETURN_FALSE;
+ }
+ case_sensitive = CONST_CS;
+ break;
+ case 3:
+ if (getParameters(ht, 3, &var, &val, &non_cs)==FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_long(non_cs);
+ if (non_cs->value.lval) {
+ case_sensitive = 0;
+ } else {
+ case_sensitive = CONST_CS;
+ }
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+ switch(val->type) {
+ case IS_LONG:
+ case IS_DOUBLE:
+ case IS_STRING:
+ break;
+ default:
+ php3_error(E_WARNING,"Constants may only evaluate to scalar values");
+ RETURN_FALSE;
+ break;
+ }
+ convert_to_string(var);
+
+ c.value = *val;
+ pval_copy_constructor(&c.value);
+ c.flags = case_sensitive | ~CONST_PERSISTENT; /* non persistent */
+ c.name = php3_strndup(var->value.str.val, var->value.str.len);
+ c.name_len = var->value.str.len+1;
+ zend_register_constant(&c);
+ RETURN_TRUE;
+}
+
+
+PHP_FUNCTION(defined)
+{
+ pval *var;
+ pval c;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &var)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(var);
+ if (zend_get_constant(var->value.str.val, var->value.str.len, &c)) {
+ pval_destructor(&c);
+ RETURN_LONG(1);
+ } else {
+ RETURN_LONG(0);
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h
new file mode 100644
index 0000000000..4a1e0bcec9
--- /dev/null
+++ b/ext/standard/basic_functions.h
@@ -0,0 +1,130 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Andi Gutmans <andi@zend.com> |
+ | Zeev Suraski <zeev@zend.com> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _BASIC_FUNCTIONS_H
+#define _BASIC_FUNCTIONS_H
+
+#include "zend_highlight.h"
+
+extern php3_module_entry basic_functions_module;
+#define basic_functions_module_ptr &basic_functions_module
+
+extern int php3_minit_basic(INIT_FUNC_ARGS);
+extern int php3_mshutdown_basic(SHUTDOWN_FUNC_ARGS);
+extern int php3_rinit_basic(INIT_FUNC_ARGS);
+extern int php3_rshutdown_basic(SHUTDOWN_FUNC_ARGS);
+extern void int_value(INTERNAL_FUNCTION_PARAMETERS);
+extern void double_value(INTERNAL_FUNCTION_PARAMETERS);
+extern void string_value(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_toggle_short_open_tag(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_sleep(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_usleep(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_key_sort(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_asort(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_arsort(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_sort(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_rsort(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_user_sort(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_auser_sort(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_user_key_sort(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_array_walk(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_count(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_flush(INTERNAL_FUNCTION_PARAMETERS);
+extern void array_end(INTERNAL_FUNCTION_PARAMETERS);
+extern void array_prev(INTERNAL_FUNCTION_PARAMETERS);
+extern void array_next(INTERNAL_FUNCTION_PARAMETERS);
+extern void array_each(INTERNAL_FUNCTION_PARAMETERS);
+extern void array_reset(INTERNAL_FUNCTION_PARAMETERS);
+extern void array_current(INTERNAL_FUNCTION_PARAMETERS);
+extern void array_current_key(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_gettype(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_settype(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_min(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_max(INTERNAL_FUNCTION_PARAMETERS);
+
+/* system functions */
+extern void php3_getenv(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_putenv(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_error_reporting(INTERNAL_FUNCTION_PARAMETERS);
+
+extern void php3_get_current_user(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_set_time_limit(INTERNAL_FUNCTION_PARAMETERS);
+
+extern void php3_get_cfg_var(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_set_magic_quotes_runtime(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_get_magic_quotes_runtime(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_get_magic_quotes_gpc(INTERNAL_FUNCTION_PARAMETERS);
+
+extern void php3_is_type(INTERNAL_FUNCTION_PARAMETERS, int type);
+extern void php3_is_long(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_is_double(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_is_string(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_is_array(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_is_object(INTERNAL_FUNCTION_PARAMETERS);
+
+extern void php3_leak(INTERNAL_FUNCTION_PARAMETERS);
+
+extern void php3_error_log(INTERNAL_FUNCTION_PARAMETERS);
+
+extern void php3_call_user_func(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_call_user_method(INTERNAL_FUNCTION_PARAMETERS);
+
+PHP_FUNCTION(register_shutdown_function);
+PHP_FUNCTION(highlight_file);
+PHP_FUNCTION(highlight_string);
+void php_get_highlight_struct(zend_syntax_highlighter_ini *syntax_highlighter_ini);
+
+PHP_FUNCTION(ob_start);
+PHP_FUNCTION(ob_end_flush);
+PHP_FUNCTION(ob_end_clean);
+PHP_FUNCTION(ob_get_contents);
+
+PHP_FUNCTION(ini_get);
+PHP_FUNCTION(ini_alter);
+PHP_FUNCTION(ini_restore);
+
+PHP_FUNCTION(print_r);
+
+PHP_FUNCTION(define);
+PHP_FUNCTION(defined);
+
+#if HAVE_PUTENV
+typedef struct {
+ char *putenv_string;
+ char *previous_value;
+ char *key;
+ int key_len;
+} putenv_entry;
+#endif
+
+#endif /* _BASIC_FUNCTIONS_H */
diff --git a/ext/standard/browscap.c b/ext/standard/browscap.c
new file mode 100644
index 0000000000..4045a698a1
--- /dev/null
+++ b/ext/standard/browscap.c
@@ -0,0 +1,137 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Zeev Suraski <zeev@zend.com> |
+ +----------------------------------------------------------------------+
+ */
+
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "php3_browscap.h"
+#include "php_ini.h"
+
+#include "zend_globals.h"
+
+#ifndef THREAD_SAFE
+HashTable browser_hash;
+static char *lookup_browser_name;
+static pval *found_browser_entry;
+#endif
+
+function_entry browscap_functions[] = {
+ {"get_browser", php3_get_browser, NULL},
+ {NULL, NULL, NULL}
+};
+
+php3_module_entry browscap_module_entry = {
+ "browscap", browscap_functions, php3_minit_browscap, php3_mshutdown_browscap, NULL, NULL, NULL, STANDARD_MODULE_PROPERTIES
+};
+
+
+static int browser_reg_compare(pval *browser)
+{
+ pval *browser_name;
+ regex_t r;
+ TLS_VARS;
+
+ if (GLOBAL(found_browser_entry)) { /* already found */
+ return 0;
+ }
+ _php3_hash_find(browser->value.ht,"browser_name_pattern",sizeof("browser_name_pattern"),(void **) &browser_name);
+ if (!strchr(browser_name->value.str.val,'*')) {
+ return 0;
+ }
+ if (regcomp(&r,browser_name->value.str.val,REG_NOSUB)!=0) {
+ return 0;
+ }
+ if (regexec(&r,GLOBAL(lookup_browser_name),0,NULL,0)==0) {
+ GLOBAL(found_browser_entry) = browser;
+ }
+ regfree(&r);
+ return 0;
+}
+
+void php3_get_browser(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *agent_name,*agent,tmp;
+ ELS_FETCH();
+
+ if (!INI_STR("browscap")) {
+ RETURN_FALSE;
+ }
+
+ switch(ARG_COUNT(ht)) {
+ case 0:
+ if (_php3_hash_find(&EG(symbol_table), "HTTP_USER_AGENT", sizeof("HTTP_USER_AGENT"), (void **) &agent_name)==FAILURE) {
+ agent_name = &tmp;
+ var_reset(agent_name);
+ }
+ break;
+ case 1:
+ if (getParameters(ht, 1, &agent_name)==FAILURE) {
+ RETURN_FALSE;
+ }
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+
+ convert_to_string(agent_name);
+
+ if (_php3_hash_find(&GLOBAL(browser_hash), agent_name->value.str.val, agent_name->value.str.len+1, (void **) &agent)==FAILURE) {
+ GLOBAL(lookup_browser_name) = agent_name->value.str.val;
+ GLOBAL(found_browser_entry) = NULL;
+ _php3_hash_apply(&GLOBAL(browser_hash),(int (*)(void *)) browser_reg_compare);
+
+ if (GLOBAL(found_browser_entry)) {
+ agent = GLOBAL(found_browser_entry);
+ } else if (_php3_hash_find(&GLOBAL(browser_hash), "Default Browser", sizeof("Default Browser"), (void **) &agent)==FAILURE) {
+ RETURN_FALSE;
+ }
+ }
+
+ *return_value = *agent;
+ return_value->type = IS_OBJECT;
+ pval_copy_constructor(return_value);
+ return_value->value.ht->pDestructor = PVAL_DESTRUCTOR;
+
+ while (_php3_hash_find(agent->value.ht, "parent", sizeof("parent"), (void **) &agent_name)==SUCCESS) {
+ if (_php3_hash_find(&GLOBAL(browser_hash), agent_name->value.str.val, agent_name->value.str.len+1, (void **) &agent)==FAILURE) {
+ break;
+ }
+ _php3_hash_merge(return_value->value.ht,agent->value.ht,(void (*)(void *pData)) pval_copy_constructor, (void *) &tmp, sizeof(pval));
+ }
+}
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/config.m4 b/ext/standard/config.m4
new file mode 100644
index 0000000000..f44a1df39f
--- /dev/null
+++ b/ext/standard/config.m4
@@ -0,0 +1,3 @@
+dnl $Id$ -*- sh -*-
+
+PHP_EXTENSION(standard)
diff --git a/ext/standard/cyr_convert.c b/ext/standard/cyr_convert.c
new file mode 100644
index 0000000000..5f36a479be
--- /dev/null
+++ b/ext/standard/cyr_convert.c
@@ -0,0 +1,301 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Kirill Maximov (kir@rus.net |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <errno.h>
+
+#include "php.h"
+#include "cyr_convert.h"
+
+#include <stdio.h>
+
+
+
+
+/*****************************************************************************
+* This is codetables for different Cyrillic charsets (relative to koi8-r).
+* Each table contains data for 128-255 symbols from ASCII table.
+* First 256 symbols are for conversion from koi8-r to corresponding charset,
+* second 256 symbols are for reverse conversion, from charset to koi8-r.
+*
+* Here we have the following tables:
+* _cyr_win1251 - for windows-1251 charset
+* _cyr_iso88595 - for iso8859-5 charset
+* _cyr_cp866 - for x-cp866 charset
+* _cyr_mac - for x-mac-cyrillic charset
+*
+*****************************************************************************/
+
+typedef unsigned char _cyr_charset_table[512];
+
+const static _cyr_charset_table _cyr_win1251 = {
+0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
+96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
+112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
+46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,
+46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,
+46,46,46,46,46,46,46,46,179,46,32,46,46,46,46,32,
+46,46,46,46,46,46,46,46,163,46,32,46,46,46,46,32,
+225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
+242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
+193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
+210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209,
+0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
+96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
+112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,184,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,168,32,32,32,32,32,32,32,32,32,32,32,32,
+254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
+239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
+222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,
+207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218,
+},
+_cyr_cp866 = {
+0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
+96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
+112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
+225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
+242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
+193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
+35,35,35,124,124,124,124,43,43,124,124,43,43,43,43,43,
+43,45,45,124,45,43,124,124,43,43,45,45,124,45,43,45,
+45,45,45,43,43,43,43,43,43,43,43,35,35,124,124,35,
+210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209,
+179,163,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
+96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
+112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,241,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,240,32,32,32,32,32,32,32,32,32,32,32,32,
+238,160,161,230,164,165,228,163,229,168,169,170,171,172,173,174,
+175,239,224,225,226,227,166,162,236,235,167,232,237,233,231,234,
+158,128,129,150,132,133,148,131,149,136,137,138,139,140,141,142,
+143,159,144,145,146,147,134,130,156,155,135,152,157,153,151,154,
+},
+_cyr_iso88595 = {
+0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
+96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
+112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,179,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
+242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
+193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
+210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209,
+32,163,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
+96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
+112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,241,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,32,161,32,32,32,32,32,32,32,32,32,32,32,32,
+238,208,209,230,212,213,228,211,229,216,217,218,219,220,221,222,
+223,239,224,225,226,227,214,210,236,235,215,232,237,233,231,234,
+206,176,177,198,180,181,196,179,197,184,185,186,187,188,189,190,
+191,207,192,193,194,195,182,178,204,203,183,200,205,201,199,202,
+},
+_cyr_mac = {
+0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
+96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
+112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
+225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
+242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
+160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
+176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
+128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
+144,145,146,147,148,149,150,151,152,153,154,155,156,179,163,209,
+193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
+210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,255,
+0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
+16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
+32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
+48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
+96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
+112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
+192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
+208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
+160,161,162,222,164,165,166,167,168,169,170,171,172,173,174,175,
+176,177,178,221,180,181,182,183,184,185,186,187,188,189,190,191,
+254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
+239,223,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
+158,128,129,150,132,133,148,131,149,136,137,138,139,140,141,142,
+143,159,144,145,146,147,134,130,156,155,135,152,157,153,151,154,
+};
+
+
+/*****************************************************************************
+* This is the function that performs real in-place conversion of the string
+* between charsets.
+* Parameters:
+* str - string to be converted
+* from,to - one-symbol label of source and destination charset
+* The following symbols are used as labels:
+* k - koi8-r
+* w - windows-1251
+* i - iso8859-5
+* a - x-cp866
+* d - x-cp866
+* m - x-mac-cyrillic
+*****************************************************************************/
+static char * _php3_convert_cyr_string(unsigned char *str, char from, char to)
+{
+ const unsigned char *from_table, *to_table;
+ unsigned char tmp;
+ int i;
+
+ from_table = NULL;
+ to_table = NULL;
+
+ switch (toupper(from))
+ {
+ case 'W':
+ from_table = _cyr_win1251;
+ break;
+ case 'A':
+ case 'D':
+ from_table = _cyr_cp866;
+ break;
+ case 'I':
+ from_table = _cyr_iso88595;
+ break;
+ case 'M':
+ from_table = _cyr_mac;
+ break;
+ case 'K':
+ break;
+ default:
+ php3_error(E_WARNING, "Unknown source charset: %c", from);
+ break;
+ }
+
+ switch (toupper(to))
+ {
+ case 'W':
+ to_table = _cyr_win1251;
+ break;
+ case 'A':
+ case 'D':
+ to_table = _cyr_cp866;
+ break;
+ case 'I':
+ to_table = _cyr_iso88595;
+ break;
+ case 'M':
+ to_table = _cyr_mac;
+ break;
+ case 'K':
+ break;
+ default:
+ php3_error(E_WARNING, "Unknown destination charset: %c", to);
+ break;
+ }
+
+
+ if (!str)
+ return (char *)str;
+
+ for( i = 0; str[i]; i++)
+ {
+ tmp = (from_table == NULL)? str[i] : from_table[ str[i] ];
+ str[i] = (to_table == NULL) ? tmp : to_table[tmp + 256];
+ }
+ return (char *)str;
+}
+
+/* {{{ proto string convert_cyr_string(string str, string from, string to)
+ Convert from one Cyrillic character set to another */
+void php3_convert_cyr_string(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str_arg, *fr_cs, *to_cs;
+ unsigned char *str;
+
+ if (ARG_COUNT(ht) != 3 || getParameters(ht,3,&str_arg, &fr_cs, &to_cs)==FAILURE)
+ {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str_arg);
+ convert_to_string(fr_cs);
+ convert_to_string(to_cs);
+
+ str = (unsigned char*) str_arg->value.str.val;
+
+ _php3_convert_cyr_string(str, fr_cs->value.str.val[0], to_cs->value.str.val[0]);
+ RETVAL_STRING((char *)str, 1)
+}
+/* }}} */
diff --git a/ext/standard/cyr_convert.h b/ext/standard/cyr_convert.h
new file mode 100644
index 0000000000..c7ac46143e
--- /dev/null
+++ b/ext/standard/cyr_convert.h
@@ -0,0 +1,40 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Kirill Maximov (kir@rus.net) |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#ifndef _CYR_CONVERT_H
+#define _CYR_CONVERT_H
+
+extern void php3_convert_cyr_string(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _CYR_CONVERT_H */
+
+
+
diff --git a/ext/standard/datetime.c b/ext/standard/datetime.c
new file mode 100644
index 0000000000..3c82fe0918
--- /dev/null
+++ b/ext/standard/datetime.c
@@ -0,0 +1,510 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Andi Gutmans <andi@zend.com> |
+ | Zeev Suraski <zeev@zend.com> |
+ | Rasmus Lerdorf <rasmus@php.net> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "zend_operators.h"
+#include "datetime.h"
+#include "snprintf.h"
+#include "php_globals.h"
+
+#include <time.h>
+#include <stdio.h>
+
+char *mon_full_names[] =
+{
+ "January", "February", "March", "April",
+ "May", "June", "July", "August",
+ "September", "October", "November", "December"
+};
+char *mon_short_names[] =
+{
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+};
+char *day_full_names[] =
+{
+ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
+};
+char *day_short_names[] =
+{
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+};
+
+#ifndef HAVE_TM_ZONE
+#ifndef _TIMEZONE
+extern time_t timezone;
+#endif
+#endif
+
+static int phpday_tab[2][12] =
+{
+ {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
+ {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
+};
+
+void php3_time(INTERNAL_FUNCTION_PARAMETERS)
+{
+ return_value->value.lval = (long) time(NULL);
+ return_value->type = IS_LONG;
+}
+
+void _php3_mktime(INTERNAL_FUNCTION_PARAMETERS, int gm)
+{
+ pval *arguments[6];
+ struct tm ta, *tn;
+ time_t t;
+ int i, gmadjust=0,arg_count = ARG_COUNT(ht);
+
+ if (arg_count > 6 || getParametersArray(ht, arg_count, arguments) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ /* convert supplied arguments to longs */
+ for (i = 0; i < arg_count; i++) {
+ convert_to_long(arguments[i]);
+ }
+ t=time(NULL);
+ if (gm) {
+ tn = gmtime(&t);
+#if HAVE_TZSET
+ tzset();
+#if HAVE_TM_ZONE
+ gmadjust=(tn->tm_gmtoff)/3600;
+#else
+ gmadjust=timezone/3600;
+#endif
+#endif
+ } else {
+ tn = localtime(&t);
+ }
+ memcpy(&ta,tn,sizeof(struct tm));
+ ta.tm_isdst = -1;
+
+ switch(arg_count) {
+ case 6:
+ ta.tm_year = arguments[5]->value.lval - ((arguments[5]->value.lval > 1000) ? 1900 : 0);
+ /* fall-through */
+ case 5:
+ ta.tm_mday = arguments[4]->value.lval;
+ /* fall-through */
+ case 4:
+ ta.tm_mon = arguments[3]->value.lval - 1;
+ /* fall-through */
+ case 3:
+ ta.tm_sec = arguments[2]->value.lval;
+ /* fall-through */
+ case 2:
+ ta.tm_min = arguments[1]->value.lval;
+ /* fall-through */
+ case 1:
+ ta.tm_hour = arguments[0]->value.lval - gmadjust;
+ case 0:
+ break;
+ }
+ return_value->value.lval = mktime(&ta);
+ return_value->type = IS_LONG;
+}
+
+void php3_mktime(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_mktime(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+
+void php3_gmmktime(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_mktime(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+
+static void
+_php3_date(INTERNAL_FUNCTION_PARAMETERS, int gm)
+{
+ pval *format, *timestamp;
+ time_t the_time;
+ struct tm *ta;
+ int i, size = 0, length, h;
+ char tmp_buff[16];
+ TLS_VARS;
+
+ switch(ARG_COUNT(ht)) {
+ case 1:
+ if (getParameters(ht, 1, &format) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ the_time = time(NULL);
+ break;
+ case 2:
+ if (getParameters(ht, 2, &format, &timestamp) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(timestamp);
+ the_time = timestamp->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(format);
+
+ if (gm) {
+ ta = gmtime(&the_time);
+ } else {
+ ta = localtime(&the_time);
+ }
+
+ if (!ta) { /* that really shouldn't happen... */
+ php3_error(E_WARNING, "unexpected error in date()");
+ RETURN_FALSE;
+ }
+ for (i = 0; i < format->value.str.len; i++) {
+ switch (format->value.str.val[i]) {
+ case 'U': /* seconds since the epoch */
+ size += 10;
+ break;
+ case 'F': /* month, textual, full */
+ case 'l': /* day (of the week), textual */
+ size += 9;
+ break;
+ case 'Y': /* year, numeric, 4 digits */
+ size += 4;
+ break;
+ case 'M': /* month, textual, 3 letters */
+ case 'D': /* day, textual, 3 letters */
+ case 'z': /* day of the year */
+ size += 3;
+ break;
+ case 'y': /* year, numeric, 2 digits */
+ case 'm': /* month, numeric */
+ case 'd': /* day of the month, numeric */
+ case 'j': /* day of the month, numeric, no leading zeros */
+ case 'H': /* hour, numeric, 24 hour format */
+ case 'h': /* hour, numeric, 12 hour format */
+ case 'i': /* minutes, numeric */
+ case 's': /* seconds, numeric */
+ case 'A': /* AM/PM */
+ case 'a': /* am/pm */
+ case 'S': /* standard english suffix for the day of the month (e.g. 3rd, 2nd, etc) */
+ size += 2;
+ break;
+ case '\\':
+ if(i < format->value.str.len-1) {
+ i++;
+ }
+ case 'w': /* day of the week, numeric */
+ default:
+ size++;
+ break;
+ }
+ }
+
+ return_value->value.str.val = (char *) emalloc(size + 1);
+ return_value->value.str.val[0] = '\0';
+
+ for (i = 0; i < format->value.str.len; i++) {
+ switch (format->value.str.val[i]) {
+ case '\\':
+ if(i < format->value.str.len-1) {
+ char ch[2];
+ ch[0]=format->value.str.val[i+1];
+ ch[1]='\0';
+ strcat(return_value->value.str.val, ch);
+ i++;
+ }
+ break;
+ case 'U': /* seconds since the epoch */
+ sprintf(tmp_buff, "%ld", (long)the_time); /* SAFE */
+ strcat(return_value->value.str.val, tmp_buff);
+ break;
+ case 'F': /* month, textual, full */
+ strcat(return_value->value.str.val, mon_full_names[ta->tm_mon]);
+ break;
+ case 'l': /* day (of the week), textual, full */
+ strcat(return_value->value.str.val, day_full_names[ta->tm_wday]);
+ break;
+ case 'Y': /* year, numeric, 4 digits */
+ sprintf(tmp_buff, "%d", ta->tm_year + 1900); /* SAFE */
+ strcat(return_value->value.str.val, tmp_buff);
+ break;
+ case 'M': /* month, textual, 3 letters */
+ strcat(return_value->value.str.val, mon_short_names[ta->tm_mon]);
+ break;
+ case 'D': /* day (of the week), textual, 3 letters */
+ strcat(return_value->value.str.val, day_short_names[ta->tm_wday]);
+ break;
+ case 'z': /* day (of the year) */
+ sprintf(tmp_buff, "%d", ta->tm_yday); /* SAFE */
+ strcat(return_value->value.str.val, tmp_buff);
+ break;
+ case 'y': /* year, numeric, 2 digits */
+ sprintf(tmp_buff, "%02d", ((ta->tm_year)%100)); /* SAFE */
+ strcat(return_value->value.str.val, tmp_buff);
+ break;
+ case 'm': /* month, numeric */
+ sprintf(tmp_buff, "%02d", ta->tm_mon + 1); /* SAFE */
+ strcat(return_value->value.str.val, tmp_buff);
+ break;
+ case 'd': /* day of the month, numeric */
+ sprintf(tmp_buff, "%02d", ta->tm_mday); /* SAFE */
+ strcat(return_value->value.str.val, tmp_buff);
+ break;
+ case 'j':
+ sprintf(tmp_buff, "%d", ta->tm_mday); /* SAFE */
+ strcat(return_value->value.str.val, tmp_buff);
+ break;
+ case 'H': /* hour, numeric, 24 hour format */
+ sprintf(tmp_buff, "%02d", ta->tm_hour); /* SAFE */
+ strcat(return_value->value.str.val, tmp_buff);
+ break;
+ case 'h': /* hour, numeric, 12 hour format */
+ h = ta->tm_hour % 12; if (h==0) h = 12;
+ sprintf(tmp_buff, "%02d", h); /* SAFE */
+ strcat(return_value->value.str.val, tmp_buff);
+ break;
+ case 'i': /* minutes, numeric */
+ sprintf(tmp_buff, "%02d", ta->tm_min); /* SAFE */
+ strcat(return_value->value.str.val, tmp_buff);
+ break;
+ case 's': /* seconds, numeric */
+ sprintf(tmp_buff, "%02d", ta->tm_sec); /* SAFE */
+ strcat(return_value->value.str.val, tmp_buff);
+ break;
+ case 'A': /* AM/PM */
+ strcat(return_value->value.str.val, (ta->tm_hour >= 12 ? "PM" : "AM"));
+ break;
+ case 'a': /* am/pm */
+ strcat(return_value->value.str.val, (ta->tm_hour >= 12 ? "pm" : "am"));
+ break;
+ case 'S': /* standard english suffix, e.g. 2nd/3rd for the day of the month */
+ if (ta->tm_mday >= 10 && ta->tm_mday <= 19) {
+ strcat(return_value->value.str.val, "th");
+ } else {
+ switch (ta->tm_mday % 10) {
+ case 1:
+ strcat(return_value->value.str.val, "st");
+ break;
+ case 2:
+ strcat(return_value->value.str.val, "nd");
+ break;
+ case 3:
+ strcat(return_value->value.str.val, "rd");
+ break;
+ default:
+ strcat(return_value->value.str.val, "th");
+ break;
+ }
+ }
+ break;
+ case 'w': /* day of the week, numeric EXTENSION */
+ sprintf(tmp_buff, "%01d", ta->tm_wday); /* SAFE */
+ strcat(return_value->value.str.val, tmp_buff);
+ break;
+ default:
+ length = strlen(return_value->value.str.val);
+ return_value->value.str.val[length] = format->value.str.val[i];
+ return_value->value.str.val[length + 1] = '\0';
+ break;
+ }
+ }
+ return_value->value.str.len = strlen(return_value->value.str.val);
+ return_value->type = IS_STRING;
+}
+
+void php3_date(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_date(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+
+void php3_gmdate(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_date(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+
+void php3_getdate(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *timestamp_arg;
+ struct tm *ta;
+ time_t timestamp;
+
+ if (ARG_COUNT(ht) == 0) {
+ timestamp = time(NULL);
+ } else if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &timestamp_arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ } else {
+ convert_to_long(timestamp_arg);
+ timestamp = timestamp_arg->value.lval;
+ }
+
+ ta = localtime(&timestamp);
+ if (!ta) {
+ php3_error(E_WARNING, "Cannot perform date calculation");
+ return;
+ }
+ if (array_init(return_value) == FAILURE) {
+ php3_error(E_ERROR, "Unable to initialize array");
+ return;
+ }
+ add_assoc_long(return_value, "seconds", ta->tm_sec);
+ add_assoc_long(return_value, "minutes", ta->tm_min);
+ add_assoc_long(return_value, "hours", ta->tm_hour);
+ add_assoc_long(return_value, "mday", ta->tm_mday);
+ add_assoc_long(return_value, "wday", ta->tm_wday);
+ add_assoc_long(return_value, "mon", ta->tm_mon + 1);
+ add_assoc_long(return_value, "year", ta->tm_year + 1900);
+ add_assoc_long(return_value, "yday", ta->tm_yday);
+ add_assoc_string(return_value, "weekday", day_full_names[ta->tm_wday], 1);
+ add_assoc_string(return_value, "month", mon_full_names[ta->tm_mon], 1);
+ add_index_long(return_value, 0, timestamp);
+}
+
+/* Return date string in standard format for http headers */
+char *php3_std_date(time_t t)
+{
+ struct tm *tm1;
+ char *str;
+ PLS_FETCH();
+
+ tm1 = gmtime(&t);
+ str = emalloc(81);
+ if (PG(y2k_compliance)) {
+ snprintf(str, 80, "%s, %02d-%s-%04d %02d:%02d:%02d GMT",
+ day_full_names[tm1->tm_wday],
+ tm1->tm_mday,
+ mon_short_names[tm1->tm_mon],
+ tm1->tm_year+1900,
+ tm1->tm_hour, tm1->tm_min, tm1->tm_sec);
+ } else {
+ snprintf(str, 80, "%s, %02d-%s-%02d %02d:%02d:%02d GMT",
+ day_full_names[tm1->tm_wday],
+ tm1->tm_mday,
+ mon_short_names[tm1->tm_mon],
+ ((tm1->tm_year)%100),
+ tm1->tm_hour, tm1->tm_min, tm1->tm_sec);
+ }
+
+ str[79]=0;
+ return (str);
+}
+
+/*
+ * CheckDate(month, day, year);
+ * returns True(1) if it is valid date
+ *
+ */
+#define isleap(year) (((year%4) == 0 && (year%100)!=0) || (year%400)==0)
+void php3_checkdate(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *month, *day, *year;
+ int m, d, y;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 3 ||
+ getParameters(ht, 3, &month, &day, &year) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(day);
+ convert_to_long(month);
+ convert_to_long(year);
+ y = year->value.lval;
+ m = month->value.lval;
+ d = day->value.lval;
+
+ if (y < 100)
+ y += 1900;
+
+ if (y < 0 || y > 32767) {
+ RETURN_FALSE;
+ }
+ if (m < 1 || m > 12) {
+ RETURN_FALSE;
+ }
+ if (d < 1 || d > phpday_tab[isleap(y)][m - 1]) {
+ RETURN_FALSE;
+ }
+ RETURN_TRUE; /* True : This month,day,year arguments are valid */
+}
+
+
+#if HAVE_STRFTIME
+
+void php3_strftime(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *format_arg, *timestamp_arg;
+ char *format,*buf;
+ time_t timestamp;
+ struct tm *ta;
+ size_t buf_len=64, real_len;
+
+ switch (ARG_COUNT(ht)) {
+ case 1:
+ if (getParameters(ht, 1, &format_arg)==FAILURE) {
+ RETURN_FALSE;
+ }
+ time(&timestamp);
+ break;
+ case 2:
+ if (getParameters(ht, 2, &format_arg, &timestamp_arg)==FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_long(timestamp_arg);
+ timestamp = timestamp_arg->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+
+ convert_to_string(format_arg);
+ if (format_arg->value.str.len==0) {
+ RETURN_FALSE;
+ }
+ format = format_arg->value.str.val;
+ ta = localtime(&timestamp);
+
+ buf = (char *) emalloc(buf_len);
+ while ((real_len=strftime(buf,buf_len,format,ta))==buf_len || real_len==0) {
+ buf_len *= 2;
+ buf = (char *) erealloc(buf, buf_len);
+ }
+
+ return_value->value.str.val = (char *) erealloc(buf,real_len+1);
+ return_value->value.str.len = real_len;
+ return_value->type = IS_STRING;
+}
+#endif
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/datetime.h b/ext/standard/datetime.h
new file mode 100644
index 0000000000..1cb6cf6723
--- /dev/null
+++ b/ext/standard/datetime.h
@@ -0,0 +1,51 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Andi Gutmans <andi@zend.com> |
+ | Zeev Suraski <zeev@zend.com> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _DATETIME_H
+#define _DATETIME_H
+
+extern void php3_time(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_mktime(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_gmmktime(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_date(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_gmdate(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_getdate(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_checkdate(INTERNAL_FUNCTION_PARAMETERS);
+#if HAVE_STRFTIME
+extern void php3_strftime(INTERNAL_FUNCTION_PARAMETERS);
+#endif
+
+extern char *php3_std_date(time_t t);
+void _php3_mktime(INTERNAL_FUNCTION_PARAMETERS, int gm);
+
+#endif /* _DATETIME_H */
diff --git a/ext/standard/dir.c b/ext/standard/dir.c
new file mode 100644
index 0000000000..1edd10d374
--- /dev/null
+++ b/ext/standard/dir.c
@@ -0,0 +1,287 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "fopen-wrappers.h"
+
+#include "php3_dir.h"
+
+#if HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <errno.h>
+
+#if MSVC5
+#if !(APACHE)
+#define NEEDRDH 1
+#endif
+#include "win32/readdir.h"
+#endif
+
+#ifndef THREAD_SAFE
+static int dirp_id = 0;
+static int le_dirp;
+#endif
+
+function_entry php3_dir_functions[] = {
+ {"opendir", php3_opendir, NULL},
+ {"closedir", php3_closedir, NULL},
+ {"chdir", php3_chdir, NULL},
+ {"rewinddir", php3_rewinddir, NULL},
+ {"readdir", php3_readdir, NULL},
+ {"dir", php3_getdir, NULL},
+ {NULL, NULL, NULL}
+};
+
+php3_module_entry php3_dir_module_entry = {
+ "PHP_dir", php3_dir_functions, php3_minit_dir, NULL, NULL, NULL, NULL, STANDARD_MODULE_PROPERTIES
+};
+
+
+int php3_minit_dir(INIT_FUNC_ARGS)
+{
+ TLS_VARS;
+
+ GLOBAL(le_dirp) = register_list_destructors(closedir,NULL);
+ return SUCCESS;
+}
+
+/* {{{ proto int opendir(string path)
+ Open a directory and return a dir_handle */
+void php3_opendir(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ DIR *dirp;
+ int ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ /* Check open_basedir */
+ if (_php3_check_open_basedir(arg->value.str.val)) RETURN_FALSE;
+
+ dirp = opendir(arg->value.str.val);
+ if (!dirp) {
+ php3_error(E_WARNING, "OpenDir: %s (errno %d)", strerror(errno),errno);
+ RETURN_FALSE;
+ }
+ ret = php3_list_insert(dirp, GLOBAL(le_dirp));
+ GLOBAL(dirp_id) = ret;
+ RETURN_LONG(ret);
+}
+/* }}} */
+
+/* {{{ proto void closedir([int dir_handle])
+Close directory connection identified by the dir_handle */
+void php3_closedir(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *id, *tmp;
+ int id_to_find;
+ DIR *dirp;
+ int dirp_type;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) == 0) {
+ if (getThis(&id) == SUCCESS) {
+ if (_php3_hash_find(id->value.ht, "handle", sizeof("handle"), (void **)&tmp) == FAILURE) {
+ php3_error(E_WARNING, "unable to find my handle property");
+ RETURN_FALSE;
+ }
+ id_to_find = tmp->value.lval;
+ } else {
+ id_to_find = GLOBAL(dirp_id);
+ }
+ } else if ((ARG_COUNT(ht) != 1) || getParameters(ht, 1, &id) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ } else {
+ convert_to_long(id);
+ id_to_find = id->value.lval;
+ }
+
+ dirp = (DIR *)php3_list_find(id_to_find, &dirp_type);
+ if (!dirp || dirp_type != GLOBAL(le_dirp)) {
+ php3_error(E_WARNING, "unable to find identifier (%d)", id_to_find);
+ RETURN_FALSE;
+ }
+ php3_list_delete(id_to_find);
+}
+/* }}} */
+
+/* {{{ proto int chdir(string directory)
+Change the current directory */
+void php3_chdir(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ int ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+ ret = chdir(arg->value.str.val);
+
+ if (ret < 0) {
+ php3_error(E_WARNING, "ChDir: %s (errno %d)", strerror(errno), errno);
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto void rewinddir([int dir_handle])
+Rewind dir_handle back to the start */
+void php3_rewinddir(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *id, *tmp;
+ int id_to_find;
+ DIR *dirp;
+ int dirp_type;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) == 0) {
+ if (getThis(&id) == SUCCESS) {
+ if (_php3_hash_find(id->value.ht, "handle", sizeof("handle"), (void **)&tmp) == FAILURE) {
+ php3_error(E_WARNING, "unable to find my handle property");
+ RETURN_FALSE;
+ }
+ id_to_find = tmp->value.lval;
+ } else {
+ id_to_find = GLOBAL(dirp_id);
+ }
+ } else if ((ARG_COUNT(ht) != 1) || getParameters(ht, 1, &id) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ } else {
+ convert_to_long(id);
+ id_to_find = id->value.lval;
+ }
+
+ dirp = (DIR *)php3_list_find(id_to_find, &dirp_type);
+ if (!dirp || dirp_type != GLOBAL(le_dirp)) {
+ php3_error(E_WARNING, "unable to find identifier (%d)", id_to_find);
+ RETURN_FALSE;
+ }
+ rewinddir(dirp);
+}
+/* }}} */
+
+/* {{{ proto string readdir([int dir_handle])
+Read directory entry from dir_handle */
+void php3_readdir(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *id, *tmp;
+ int id_to_find;
+ DIR *dirp;
+ int dirp_type;
+ struct dirent *direntp;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) == 0) {
+ if (getThis(&id) == SUCCESS) {
+ if (_php3_hash_find(id->value.ht, "handle", sizeof("handle"), (void **)&tmp) == FAILURE) {
+ php3_error(E_WARNING, "unable to find my handle property");
+ RETURN_FALSE;
+ }
+ id_to_find = tmp->value.lval;
+ } else {
+ id_to_find = GLOBAL(dirp_id);
+ }
+ } else if ((ARG_COUNT(ht) != 1) || getParameters(ht, 1, &id) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ } else {
+ convert_to_long(id);
+ id_to_find = id->value.lval;
+ }
+
+ dirp = (DIR *)php3_list_find(id_to_find, &dirp_type);
+ if (!dirp || dirp_type != GLOBAL(le_dirp)) {
+ php3_error(E_WARNING, "unable to find identifier (%d)", id_to_find);
+ RETURN_FALSE;
+ }
+ direntp = readdir(dirp);
+ if (direntp) {
+ RETURN_STRINGL(direntp->d_name, strlen(direntp->d_name), 1);
+ }
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto class dir(string directory)
+Directory class with properties, handle and class and methods read, rewind and close */
+void php3_getdir(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg;
+ DIR *dirp;
+ int ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ /* Check open_basedir */
+ if (_php3_check_open_basedir(arg->value.str.val)) RETURN_FALSE;
+
+ dirp = opendir(arg->value.str.val);
+ if (!dirp) {
+ php3_error(E_WARNING, "OpenDir: %s (errno %d)", strerror(errno), errno);
+ RETURN_FALSE;
+ }
+ ret = php3_list_insert(dirp, GLOBAL(le_dirp));
+ GLOBAL(dirp_id) = ret;
+
+ /* construct an object with some methods */
+ object_init(return_value);
+ add_property_long(return_value, "handle", ret);
+ add_property_stringl(return_value, "path", arg->value.str.val, arg->value.str.len, 1);
+ add_method(return_value, "read", php3_readdir);
+ add_method(return_value, "rewind", php3_rewinddir);
+ add_method(return_value, "close", php3_closedir);
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/dns.c b/ext/standard/dns.c
new file mode 100644
index 0000000000..5a338856d0
--- /dev/null
+++ b/ext/standard/dns.c
@@ -0,0 +1,343 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: |
+ | |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#if HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#if WIN32|WINNT
+#if HAVE_BINDLIB
+#ifndef WINNT
+#define WINNT 1
+#endif
+/* located in www.php.net/extra/bindlib.zip */
+#include "arpa/inet.h"
+#include "netdb.h"
+#include "arpa/nameser.h"
+#include "resolv.h"
+#endif
+#include <winsock.h>
+#else
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#ifdef _OSD_POSIX
+#undef STATUS
+#undef T_UNSPEC
+#endif
+#include <arpa/nameser.h>
+#include <resolv.h>
+#endif
+
+#include "dns.h"
+
+char *_php3_gethostbyaddr(char *ip);
+char *_php3_gethostbyname(char *name);
+
+/* {{{ proto string gethostbyaddr(string ip_address)
+ Get the Internet host name corresponding to a given IP address */
+void php3_gethostbyaddr(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ return_value->value.str.val = _php3_gethostbyaddr(arg->value.str.val);
+ return_value->value.str.len = strlen(return_value->value.str.val);
+ return_value->type = IS_STRING;
+}
+/* }}} */
+
+
+char *_php3_gethostbyaddr(char *ip)
+{
+ unsigned long addr;
+ struct hostent *hp;
+
+ if ((int) (addr = inet_addr(ip)) == -1) {
+#if DEBUG
+ php3_error(E_WARNING, "address not in a.b.c.d form");
+#endif
+ return estrdup(ip);
+ }
+ hp = gethostbyaddr((char *) &addr, sizeof(addr), AF_INET);
+ if (!hp) {
+#if DEBUG
+ php3_error(E_WARNING, "Unable to resolve %s\n", ip);
+#endif
+ return estrdup(ip);
+ }
+ return estrdup(hp->h_name);
+}
+
+/* {{{ proto string gethostbyname(string hostname)
+ Get the IP address corresponding to a given Internet host name */
+void php3_gethostbyname(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ return_value->value.str.val = _php3_gethostbyname(arg->value.str.val);
+ return_value->value.str.len = strlen(return_value->value.str.val);
+ return_value->type = IS_STRING;
+}
+/* }}} */
+
+/* {{{ proto array gethostbynamel(string hostname)
+ Return a list of IP addresses that a given hostname resolves to. */
+void php3_gethostbynamel(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ struct hostent *hp;
+ struct in_addr in;
+ int i;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ if (array_init(return_value) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ hp = gethostbyname(arg->value.str.val);
+ if (hp == NULL || hp->h_addr_list == NULL) {
+#if DEBUG
+ php3_error(E_WARNING, "Unable to resolve %s\n", arg->value.str.val);
+#endif
+ return;
+ }
+
+ for (i = 0 ; hp->h_addr_list[i] != 0 ; i++) {
+ memcpy(&in.s_addr, hp->h_addr_list[i], sizeof(in.s_addr));
+ add_next_index_string(return_value, inet_ntoa(in), 1);
+ }
+
+ return;
+}
+/* }}} */
+
+char *_php3_gethostbyname(char *name)
+{
+ struct hostent *hp;
+ struct in_addr in;
+
+ hp = gethostbyname(name);
+ if (!hp || !hp->h_addr_list) {
+#if DEBUG
+ php3_error(E_WARNING, "Unable to resolve %s\n", name);
+#endif
+ return estrdup(name);
+ }
+ memcpy(&in.s_addr, *(hp->h_addr_list), sizeof(in.s_addr));
+ return estrdup(inet_ntoa(in));
+}
+
+#if !(WIN32|WINNT)||HAVE_BINDLIB
+
+/* {{{ proto int checkdnsrr(string host [, string type])
+ Check DNS records corresponding to a given Internet host name or IP address */
+void php3_checkdnsrr(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg1,*arg2;
+ int type,i;
+#ifndef MAXPACKET
+#define MAXPACKET 8192 /* max packet size used internally by BIND */
+#endif
+ u_char ans[MAXPACKET];
+ TLS_VARS;
+
+ switch (ARG_COUNT(ht)) {
+ case 1:
+ if (getParameters(ht, 1, &arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ type = T_MX;
+ convert_to_string(arg1);
+ break;
+ case 2:
+ if (getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg1);
+ convert_to_string(arg2);
+ if ( !strcasecmp("A",arg2->value.str.val) ) type = T_A;
+ else if ( !strcasecmp("NS",arg2->value.str.val) ) type = T_NS;
+ else if ( !strcasecmp("MX",arg2->value.str.val) ) type = T_MX;
+ else if ( !strcasecmp("PTR",arg2->value.str.val) ) type = T_PTR;
+ else if ( !strcasecmp("ANY",arg2->value.str.val) ) type = T_ANY;
+ else if ( !strcasecmp("SOA",arg2->value.str.val) ) type = T_SOA;
+ else if ( !strcasecmp("CNAME",arg2->value.str.val) ) type = T_CNAME;
+ else {
+ php3_error(E_WARNING,"Type '%s' not supported",arg2->value.str.val);
+ RETURN_FALSE;
+ }
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+ i = res_search(arg1->value.str.val,C_IN,type,ans,sizeof(ans));
+ if ( i < 0 ) {
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+}
+/* }}} */
+
+#ifndef HFIXEDSZ
+#define HFIXEDSZ 12 /* fixed data in header <arpa/nameser.h> */
+#endif /* HFIXEDSZ */
+
+#ifndef QFIXEDSZ
+#define QFIXEDSZ 4 /* fixed data in query <arpa/nameser.h> */
+#endif /* QFIXEDSZ */
+
+#ifndef MAXHOSTNAMELEN
+#define MAXHOSTNAMELEN 256
+#endif /* MAXHOSTNAMELEN */
+
+/* {{{ proto int getmxrr(string hostname, array mxhosts [, array weight])
+ Get MX records corresponding to a given Internet host name */
+void php3_getmxrr(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *host, *mx_list, *weight_list;
+ pval tmp1,tmp2;
+ int need_weight = 0;
+ int count,qdc;
+ u_short type,weight;
+ u_char ans[MAXPACKET];
+ char buf[MAXHOSTNAMELEN];
+ HEADER *hp;
+ u_char *cp,*end;
+ int i;
+
+ switch(ARG_COUNT(ht)) {
+ case 2:
+ if (getParameters(ht, 2, &host, &mx_list) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ if (!ParameterPassedByReference(ht, 2)) {
+ php3_error(E_WARNING, "Array to be filled with values must be passed by reference.");
+ RETURN_FALSE;
+ }
+ break;
+ case 3:
+ if (getParameters(ht, 3, &host, &mx_list, &weight_list) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ if (!ParameterPassedByReference(ht, 2) || !ParameterPassedByReference(ht, 3)) {
+ php3_error(E_WARNING, "Array to be filled with values must be passed by reference.");
+ RETURN_FALSE;
+ }
+ need_weight = 1;
+ pval_destructor(weight_list _INLINE_TLS); /* start with clean array */
+ if ( array_init(weight_list) == FAILURE ) {
+ RETURN_FALSE;
+ }
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string( host );
+ pval_destructor(mx_list _INLINE_TLS); /* start with clean array */
+ if ( array_init(mx_list) == FAILURE ) {
+ RETURN_FALSE;
+ }
+
+ /* Go! */
+ i = res_search(host->value.str.val,C_IN,T_MX,(u_char *)&ans,sizeof(ans));
+ if ( i < 0 ) {
+ RETURN_FALSE;
+ }
+ if ( i > sizeof(ans) ) i = sizeof(ans);
+ hp = (HEADER *)&ans;
+ cp = (u_char *)&ans + HFIXEDSZ;
+ end = (u_char *)&ans +i;
+ for ( qdc = ntohs((unsigned short)hp->qdcount); qdc--; cp += i + QFIXEDSZ) {
+ if ( (i = dn_skipname(cp,end)) < 0 ) {
+ RETURN_FALSE;
+ }
+ }
+ count = ntohs((unsigned short)hp->ancount);
+ while ( --count >= 0 && cp < end ) {
+ if ( (i = dn_skipname(cp,end)) < 0 ) {
+ RETURN_FALSE;
+ }
+ cp += i;
+ GETSHORT(type,cp);
+ cp += INT16SZ + INT32SZ;
+ GETSHORT(i,cp);
+ if ( type != T_MX ) {
+ cp += i;
+ continue;
+ }
+ GETSHORT(weight,cp);
+ if ( (i = dn_expand(ans,end,cp,buf,sizeof(buf)-1)) < 0 ) {
+ RETURN_FALSE;
+ }
+ cp += i;
+ tmp1.value.str.len = strlen(buf);
+ tmp1.value.str.val = estrndup(buf,tmp1.value.str.len);
+ tmp1.type = IS_STRING;
+ _php3_hash_next_index_insert(mx_list->value.ht, (void *)&tmp1, sizeof(pval), NULL);
+ if ( need_weight ) {
+ tmp2.value.lval = (long)weight;
+ tmp2.type = IS_LONG;
+ _php3_hash_next_index_insert(weight_list->value.ht, (void *)&tmp2, sizeof(pval), NULL);
+ }
+ }
+ RETURN_TRUE;
+}
+/* }}} */
+
+#endif
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/dns.h b/ext/standard/dns.h
new file mode 100644
index 0000000000..c9f3706848
--- /dev/null
+++ b/ext/standard/dns.h
@@ -0,0 +1,53 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: |
+ | |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _DNS_H
+#define _DNS_H
+
+extern void php3_gethostbyaddr(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_gethostbyname(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_gethostbynamel(INTERNAL_FUNCTION_PARAMETERS);
+#if !(WIN32|WINNT)||(HAVE_BINDLIB)
+extern void php3_checkdnsrr(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_getmxrr(INTERNAL_FUNCTION_PARAMETERS);
+#endif
+
+#ifndef INT16SZ
+#define INT16SZ 2
+#endif
+
+#ifndef INT32SZ
+#define INT32SZ 4
+#endif
+
+#endif /* _DNS_H */
diff --git a/ext/standard/exec.c b/ext/standard/exec.c
new file mode 100644
index 0000000000..cb953fc9bd
--- /dev/null
+++ b/ext/standard/exec.c
@@ -0,0 +1,388 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Author: Rasmus Lerdorf |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include <stdio.h>
+#include "php.h"
+#include <ctype.h>
+#include "php3_string.h"
+#include "safe_mode.h"
+#include "head.h"
+#include "exec.h"
+#include "php_globals.h"
+
+#if HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+
+/*
+ * If type==0, only last line of output is returned (exec)
+ * If type==1, all lines will be printed and last lined returned (system)
+ * If type==2, all lines will be saved to given array (exec with &$array)
+ * If type==3, output will be printed binary, no lines will be saved or returned (passthru)
+ *
+ */
+static int _Exec(int type, char *cmd, pval *array, pval *return_value)
+{
+ FILE *fp;
+ char buf[EXEC_INPUT_BUF], *tmp=NULL;
+ int t, l, ret, output=1;
+ int overflow_limit, lcmd, ldir;
+ char *b, *c, *d=NULL;
+ PLS_FETCH();
+
+ if (PG(safe_mode)) {
+ lcmd = strlen(cmd);
+ ldir = strlen(PG(safe_mode_exec_dir));
+ l = lcmd + ldir + 2;
+ overflow_limit = l;
+ c = strchr(cmd, ' ');
+ if (c) *c = '\0';
+ if (strstr(cmd, "..")) {
+ php3_error(E_WARNING, "No '..' components allowed in path");
+ return -1;
+ }
+ d = emalloc(l);
+ strcpy(d, PG(safe_mode_exec_dir));
+ overflow_limit -= ldir;
+ b = strrchr(cmd, '/');
+ if (b) {
+ strcat(d, b);
+ overflow_limit -= strlen(b);
+ } else {
+ strcat(d, "/");
+ strcat(d, cmd);
+ overflow_limit-=(strlen(cmd)+1);
+ }
+ if (c) {
+ *c = ' ';
+ strncat(d, c, overflow_limit);
+ }
+ tmp = _php3_escapeshellcmd(d);
+ efree(d);
+ d = tmp;
+#if WIN32|WINNT
+ fp = popen(d, "rb");
+#else
+ fp = popen(d, "r");
+#endif
+ if (!fp) {
+ php3_error(E_WARNING, "Unable to fork [%s]", d);
+ efree(d);
+ return -1;
+ }
+ } else { /* not safe_mode */
+#if WIN32|WINNT
+ fp = popen(cmd, "rb");
+#else
+ fp = popen(cmd, "r");
+#endif
+ if (!fp) {
+ php3_error(E_WARNING, "Unable to fork [%s]", cmd);
+ return -1;
+ }
+ }
+ buf[0] = '\0';
+ if (type==2) {
+ if (array->type != IS_ARRAY) {
+ pval_destructor(array _INLINE_TLS);
+ array_init(array);
+ }
+ }
+ if (type != 3) {
+ while (fgets(buf, EXEC_INPUT_BUF - 1, fp)) {
+ if (type == 1) {
+ if (output) PUTS(buf);
+#if APACHE
+# if MODULE_MAGIC_NUMBER > 19970110
+ if (output) rflush(GLOBAL(php3_rqst));
+# else
+ if (output) bflush(GLOBAL(php3_rqst)->connection->client);
+# endif
+#endif
+#if CGI_BINARY
+ fflush(stdout);
+#endif
+#if FHTTPD
+ /* fhttpd doesn't flush */
+#endif
+#if USE_SAPI
+ GLOBAL(sapi_rqst)->flush(GLOBAL(sapi_rqst)->scid);
+#endif
+ }
+ else if (type == 2) {
+ pval tmp;
+
+ /* strip trailing whitespaces */
+ l = strlen(buf);
+ t = l;
+ while (l && isspace((int)buf[--l]));
+ if (l < t) buf[l + 1] = '\0';
+ tmp.value.str.len = strlen(buf);
+ tmp.value.str.val = estrndup(buf,tmp.value.str.len);
+ tmp.type = IS_STRING;
+ _php3_hash_next_index_insert(array->value.ht,(void *) &tmp, sizeof(pval), NULL);
+ }
+ }
+
+ /* strip trailing spaces */
+ l = strlen(buf);
+ t = l;
+ while (l && isspace((int)buf[--l]));
+ if (l < t) buf[l + 1] = '\0';
+
+ } else {
+ int b, i;
+
+ while ((b = fread(buf, 1, sizeof(buf), fp)) > 0) {
+ for (i = 0; i < b; i++)
+ if (output) PUTC(buf[i]);
+ }
+ }
+
+ /* Return last line from the shell command */
+ if (PG(magic_quotes_runtime) && type!=3) {
+ int len;
+
+ tmp = _php3_addslashes(buf, 0, &len, 0);
+ RETVAL_STRINGL(tmp,len,0);
+ } else {
+ RETVAL_STRING(buf,1);
+ }
+
+ ret = pclose(fp);
+#if HAVE_SYS_WAIT_H
+ if (WIFEXITED(ret)) {
+ ret = WEXITSTATUS(ret);
+ }
+#endif
+
+ if (d) efree(d);
+ return ret;
+}
+
+/* {{{ proto int exec(string command [, array output [, int return_value]])
+ Execute an external program */
+void php3_exec(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg1, *arg2, *arg3;
+ int arg_count = ARG_COUNT(ht);
+ int ret;
+
+ if (arg_count > 3 || getParameters(ht, arg_count, &arg1, &arg2, &arg3) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ switch (arg_count) {
+ case 1:
+ ret = _Exec(0, arg1->value.str.val, NULL, return_value);
+ break;
+ case 2:
+ if (!ParameterPassedByReference(ht,2)) {
+ php3_error(E_WARNING,"Array argument to exec() not passed by reference");
+ }
+ ret = _Exec(2, arg1->value.str.val, arg2, return_value);
+ break;
+ case 3:
+ if (!ParameterPassedByReference(ht,2)) {
+ php3_error(E_WARNING,"Array argument to exec() not passed by reference");
+ }
+ if (!ParameterPassedByReference(ht,3)) {
+ php3_error(E_WARNING,"return_status argument to exec() not passed by reference");
+ }
+ ret = _Exec(2, arg1->value.str.val, arg2, return_value);
+ arg3->type = IS_LONG;
+ arg3->value.lval=ret;
+ break;
+ }
+}
+/* }}} */
+
+/* {{{ proto int system(string command [, int return_value])
+ Execute an external program and display output */
+void php3_system(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg1, *arg2;
+ int arg_count = ARG_COUNT(ht);
+ int ret;
+
+ if (arg_count > 2 || getParameters(ht, arg_count, &arg1, &arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ switch (arg_count) {
+ case 1:
+ ret = _Exec(1, arg1->value.str.val, NULL, return_value);
+ break;
+ case 2:
+ if (!ParameterPassedByReference(ht,2)) {
+ php3_error(E_WARNING,"return_status argument to system() not passed by reference");
+ }
+ ret = _Exec(1, arg1->value.str.val, NULL, return_value);
+ arg2->type = IS_LONG;
+ arg2->value.lval=ret;
+ break;
+ }
+}
+/* }}} */
+
+/* {{{ proto int passthru(string command [, int return_value])
+ Execute an external program and display raw output */
+void php3_passthru(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg1, *arg2;
+ int arg_count = ARG_COUNT(ht);
+ int ret;
+
+ if (arg_count > 2 || getParameters(ht, arg_count, &arg1, &arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ switch (arg_count) {
+ case 1:
+ ret = _Exec(3, arg1->value.str.val, NULL, return_value);
+ break;
+ case 2:
+ if (!ParameterPassedByReference(ht,2)) {
+ php3_error(E_WARNING,"return_status argument to system() not passed by reference");
+ }
+ ret = _Exec(3, arg1->value.str.val, NULL, return_value);
+ arg2->type = IS_LONG;
+ arg2->value.lval=ret;
+ break;
+ }
+}
+/* }}} */
+
+static int php3_ind(char *s, char c)
+{
+ register int x;
+
+ for (x = 0; s[x]; x++)
+ if (s[x] == c)
+ return x;
+
+ return -1;
+}
+
+/* Escape all chars that could possibly be used to
+ break out of a shell command
+
+ This function emalloc's a string and returns the pointer.
+ Remember to efree it when done with it.
+
+ *NOT* safe for binary strings
+*/
+char * _php3_escapeshellcmd(char *str) {
+ register int x, y, l;
+ char *cmd;
+
+ l = strlen(str);
+ cmd = emalloc(2 * l + 1);
+ strcpy(cmd, str);
+ for (x = 0; cmd[x]; x++) {
+ if (php3_ind("&;`'\"|*?~<>^()[]{}$\\\x0A\xFF", cmd[x]) != -1) {
+ for (y = l + 1; y > x; y--)
+ cmd[y] = cmd[y - 1];
+ l++; /* length has been increased */
+ cmd[x] = '\\';
+ x++; /* skip the character */
+ }
+ }
+ return cmd;
+}
+
+/* {{{ proto escapeshellcmd(string command)
+ escape shell metacharacters */
+void php3_escapeshellcmd(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg1;
+ char *cmd;
+ TLS_VARS;
+
+ if (getParameters(ht, 1, &arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ cmd = _php3_escapeshellcmd(arg1->value.str.val);
+
+ RETVAL_STRING(cmd,1);
+ efree(cmd);
+}
+/* }}} */
+
+
+PHP_FUNCTION(shell_exec)
+{
+ FILE *in;
+ int readbytes,total_readbytes=0,allocated_space;
+ pval *cmd;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &cmd)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ if (PG(safe_mode)) {
+ php3_error(E_WARNING,"Cannot execute using backquotes in safe mode");
+ RETURN_FALSE;
+ }
+
+ convert_to_string(cmd);
+#if WIN32|WINNT
+ if ((in=popen(cmd->value.str.val,"rt"))==NULL) {
+#else
+ if ((in=popen(cmd->value.str.val,"r"))==NULL) {
+#endif
+ php3_error(E_WARNING,"Unable to execute '%s'",cmd->value.str.val);
+ }
+ allocated_space = EXEC_INPUT_BUF;
+ return_value->value.str.val = (char *) emalloc(allocated_space);
+ while (1) {
+ readbytes = fread(return_value->value.str.val+total_readbytes,1,EXEC_INPUT_BUF,in);
+ if (readbytes<=0) {
+ break;
+ }
+ total_readbytes += readbytes;
+ allocated_space = total_readbytes+EXEC_INPUT_BUF;
+ return_value->value.str.val = (char *) erealloc(return_value->value.str.val,allocated_space);
+ }
+ fclose(in);
+
+ return_value->value.str.val = erealloc(return_value->value.str.val,total_readbytes+1);
+ return_value->value.str.val[total_readbytes]=0;
+ return_value->value.str.len = total_readbytes;
+ return_value->type = IS_STRING;
+}
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/exec.h b/ext/standard/exec.h
new file mode 100644
index 0000000000..f8062ba828
--- /dev/null
+++ b/ext/standard/exec.h
@@ -0,0 +1,43 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _EXEC_H
+#define _EXEC_H
+
+extern void php3_system(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_exec(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_escapeshellcmd(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_passthru(INTERNAL_FUNCTION_PARAMETERS);
+PHP_FUNCTION(shell_exec);
+
+char *_php3_escapeshellcmd(char *);
+#endif /* _EXEC_H */
diff --git a/ext/standard/file.c b/ext/standard/file.c
new file mode 100644
index 0000000000..cedb4b5109
--- /dev/null
+++ b/ext/standard/file.c
@@ -0,0 +1,1435 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#if MSVC5
+#include <windows.h>
+#include <winsock.h>
+#define O_RDONLY _O_RDONLY
+#include "win32/param.h"
+#include "win32/winutil.h"
+#else
+#include <sys/param.h>
+#include <sys/socket.h>
+/* #include <sys/uio.h> */
+#endif
+#include "head.h"
+#include "safe_mode.h"
+#include "php3_string.h"
+#include "file.h"
+#if HAVE_PWD_H
+#if MSVC5
+#include "win32/pwd.h"
+#else
+#include <pwd.h>
+#endif
+#endif
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include "snprintf.h"
+#include "fsock.h"
+#include "fopen-wrappers.h"
+#include "php_globals.h"
+
+#if MISSING_FCLOSE_DECL
+extern int fclose();
+#endif
+
+static void _php3_closesocket(int *);
+
+#ifndef THREAD_SAFE
+static int fgetss_state = 0;
+int le_fp,le_pp;
+int wsa_fp; /*to handle reading and writing to windows sockets*/
+static int pclose_ret;
+extern int le_uploads;
+#endif
+
+#ifndef HAVE_TEMPNAM
+/*
+ * Copyright (c) 1988, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <unistd.h>
+
+#ifndef MAXPATHLEN
+# ifdef PATH_MAX
+# define MAXPATHLEN PATH_MAX
+# else
+# define MAXPATHLEN 255
+# endif
+#endif
+
+char *
+tempnam(const char *dir, const char *pfx)
+{
+ int save_errno;
+ char *f, *name;
+ static char path_tmp[] = "/tmp";
+
+ if (!(name = emalloc(MAXPATHLEN))) {
+ return(NULL);
+ }
+
+ if (!pfx) {
+ pfx = "tmp.";
+ }
+
+ if (f = getenv("TMPDIR")) {
+ (void)snprintf(name, MAXPATHLEN, "%s%s%sXXXXXX", f,
+ *(f + strlen(f) - 1) == '/'? "": "/", pfx);
+ if (f = mktemp(name))
+ return(f);
+ }
+
+ if (f = (char *)dir) {
+ (void)snprintf(name, MAXPATHLEN, "%s%s%sXXXXXX", f,
+ *(f + strlen(f) - 1) == '/'? "": "/", pfx);
+ if (f = mktemp(name))
+ return(f);
+ }
+
+ f = P_tmpdir;
+ (void)snprintf(name, MAXPATHLEN, "%s%sXXXXXX", f, pfx);
+ if (f = mktemp(name))
+ return(f);
+
+ f = path_tmp;
+ (void)snprintf(name, MAXPATHLEN, "%s%sXXXXXX", f, pfx);
+ if (f = mktemp(name))
+ return(f);
+
+ save_errno = errno;
+ efree(name);
+ errno = save_errno;
+ return(NULL);
+}
+#endif
+
+function_entry php3_file_functions[] = {
+ {"pclose", php3_pclose, NULL},
+ {"popen", php3_popen, NULL},
+ {"readfile", php3_readfile, NULL},
+ {"rewind", php3_rewind, NULL},
+ {"rmdir", php3_rmdir, NULL},
+ {"umask", php3_fileumask, NULL},
+ {"fclose", php3_fclose, NULL},
+ {"feof", php3_feof, NULL},
+ {"fgetc", php3_fgetc, NULL},
+ {"fgets", php3_fgets, NULL},
+ {"fgetss", php3_fgetss, NULL},
+ {"fread", php3_fread, NULL},
+ {"fopen", php3_fopen, NULL},
+ {"fpassthru", php3_fpassthru, NULL},
+ {"fseek", php3_fseek, NULL},
+ {"ftell", php3_ftell, NULL},
+ {"fwrite", php3_fwrite, NULL},
+ {"fputs", php3_fwrite, NULL},
+ {"mkdir", php3_mkdir, NULL},
+ {"rename", php3_rename, NULL},
+ {"copy", php3_file_copy, NULL},
+ {"tempnam", php3_tempnam, NULL},
+ {"file", php3_file, NULL},
+ {"get_meta_tags", php3_get_meta_tags, NULL},
+ {"set_socket_blocking", php3_set_socket_blocking, NULL},
+#if (0 && HAVE_SYS_TIME_H && HAVE_SETSOCKOPT && defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO))
+ {"set_socket_timeout", php3_set_socket_timeout, NULL},
+#endif
+ {NULL, NULL, NULL}
+};
+
+php3_module_entry php3_file_module_entry = {
+ "PHP_file", php3_file_functions, php3_minit_file, NULL, NULL, NULL, NULL, STANDARD_MODULE_PROPERTIES
+};
+
+/* {{{ proto array get_meta_tags(string filename [, int use_include_path])
+ Extracts all meta tag content attributes from a file and returns an array */
+void php3_get_meta_tags(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *filename, *arg2;
+ FILE *fp;
+ char buf[8192];
+ int use_include_path = 0;
+ int issock=0, socketd=0;
+ int len, var_namelen;
+ char var_name[50],*val=NULL,*tmp,*end,*slashed;
+ PLS_FETCH();
+
+ /* check args */
+ switch (ARG_COUNT(ht)) {
+ case 1:
+ if (getParameters(ht,1,&filename) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ break;
+ case 2:
+ if (getParameters(ht,2,&filename,&arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg2);
+ use_include_path = arg2->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(filename);
+
+ fp = php3_fopen_wrapper(filename->value.str.val,"r", use_include_path|ENFORCE_SAFE_MODE, &issock, &socketd);
+ if (!fp && !socketd) {
+ if (issock != BAD_URL) {
+ php3_strip_url_passwd(filename->value.str.val);
+ php3_error(E_WARNING,"File(\"%s\") - %s",filename->value.str.val,strerror(errno));
+ }
+ RETURN_FALSE;
+ }
+
+ if (array_init(return_value)==FAILURE) {
+ if (issock) {
+#if WIN32|WINNT
+ closesocket(socketd);
+#else
+ close(socketd);
+#endif
+ } else {
+ fclose(fp);
+ }
+ RETURN_FALSE;
+ }
+ /* Now loop through the file and do the magic quotes thing if needed */
+ memset(buf,0,8191);
+ while((issock?SOCK_FGETS(buf,8191,socketd):(int)fgets(buf,8191,fp))
+ && !php3i_stristr(buf,"</head>")) {
+ if(php3i_stristr(buf,"<meta")) {
+
+ memset(var_name,0,50);
+ /* get the variable name from the name attribute of the meta tag */
+ tmp=php3i_stristr(buf,"name=\"");
+ if(tmp) {
+ tmp+=6;
+ end=strstr(tmp,"\"");
+ if(end) {
+ unsigned char *c;
+ *end='\0';
+ snprintf(var_name,50,"%s",tmp);
+ *end='"';
+
+ c = (unsigned char*)var_name;
+ while (*c) {
+ switch(*c) {
+ case '.':
+ case '\\':
+ case '+':
+ case '*':
+ case '?':
+ case '[':
+ case '^':
+ case ']':
+ case '$':
+ case '(':
+ case ')':
+ case ' ':
+ *c++ ='_';
+ break;
+ default:
+ *c++ = tolower((unsigned char)*c);
+ }
+ }
+ var_namelen=strlen(var_name);
+ }
+
+ /* get the variable value from the content attribute of the meta tag */
+ tmp=php3i_stristr(buf,"content=\"");
+ if(tmp) {
+ tmp+=9;
+ end=strstr(tmp,"\"");
+ if(end) {
+ *end='\0';
+ val=estrdup(tmp);
+ *end='"';
+ }
+ }
+ }
+ if(*var_name && val) {
+ if (PG(magic_quotes_runtime)) {
+ slashed = _php3_addslashes(val,0,&len,0);
+ } else {
+ slashed = estrndup(val,strlen(val));
+ }
+ add_assoc_string(return_value, var_name, slashed, 0);
+ efree(val);
+ }
+ }
+ }
+ if (issock) {
+#if WIN32|WINNT
+ closesocket(socketd);
+#else
+ close(socketd);
+#endif
+ } else {
+ fclose(fp);
+ }
+}
+/* }}} */
+
+/* {{{ proto array file(string filename)
+Read entire file into an array */
+void php3_file(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *filename, *arg2;
+ FILE *fp;
+ char *slashed, buf[8192];
+ register int i=0;
+ int use_include_path = 0;
+ int issock=0, socketd=0;
+ PLS_FETCH();
+
+ /* check args */
+ switch (ARG_COUNT(ht)) {
+ case 1:
+ if (getParameters(ht,1,&filename) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ break;
+ case 2:
+ if (getParameters(ht,2,&filename,&arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg2);
+ use_include_path = arg2->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(filename);
+
+ fp = php3_fopen_wrapper(filename->value.str.val,"r", use_include_path|ENFORCE_SAFE_MODE, &issock, &socketd);
+ if (!fp && !socketd) {
+ if (issock != BAD_URL) {
+ php3_strip_url_passwd(filename->value.str.val);
+ php3_error(E_WARNING,"File(\"%s\") - %s",filename->value.str.val,strerror(errno));
+ }
+ RETURN_FALSE;
+ }
+
+ /* Initialize return array */
+ if (array_init(return_value) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ /* Now loop through the file and do the magic quotes thing if needed */
+ memset(buf,0,8191);
+ while(issock?SOCK_FGETS(buf,8191,socketd):(int)fgets(buf,8191,fp)) {
+ if (PG(magic_quotes_runtime)) {
+ int len;
+
+ slashed = _php3_addslashes(buf,0,&len,0); /* 0 = don't free source string */
+ add_index_stringl(return_value, i++, slashed, len, 0);
+ } else {
+ add_index_string(return_value, i++, buf, 1);
+ }
+ }
+ if (issock) {
+#if WIN32|WINNT
+ closesocket(socketd);
+#else
+ close(socketd);
+#endif
+ } else {
+ fclose(fp);
+ }
+}
+/* }}} */
+
+
+static void __pclose(FILE *pipe)
+{
+TLS_VARS;
+ GLOBAL(pclose_ret) = pclose(pipe);
+}
+
+static void _php3_closesocket(int *sock) {
+ int socketd=*sock;
+ if (socketd){
+#if WIN32|WINNT
+ closesocket(socketd);
+#else
+ close(socketd);
+#endif
+ efree(sock);
+ }
+}
+
+static void _php3_unlink_uploaded_file(char *file) {
+ if(file) {
+ unlink(file);
+ }
+}
+
+int php3_minit_file(INIT_FUNC_ARGS)
+{
+ TLS_VARS;
+
+ GLOBAL(le_fp) = register_list_destructors(fclose,NULL);
+ GLOBAL(le_pp) = register_list_destructors(__pclose,NULL);
+ GLOBAL(wsa_fp) = register_list_destructors(_php3_closesocket,NULL);
+ GLOBAL(le_uploads) = register_list_destructors(_php3_unlink_uploaded_file,NULL);
+ return SUCCESS;
+}
+
+/* {{{ proto string tempnam(string dir, string prefix)
+Create a unique filename in a directory */
+void php3_tempnam(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1, *arg2;
+ char *d;
+ char *t;
+ char p[64];
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg1);
+ convert_to_string(arg2);
+ d = estrndup(arg1->value.str.val,arg1->value.str.len);
+ strncpy(p,arg2->value.str.val,sizeof(p));
+
+ t = tempnam(d,p);
+ efree(d);
+ RETURN_STRING(t,1);
+}
+/* }}} */
+
+/* {{{ proto int fopen(string filename, string mode [, int use_include_path])
+Open a file or a URL and return a file pointer */
+void php3_fopen(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1, *arg2, *arg3;
+ FILE *fp;
+ char *p;
+ int *sock;
+ int id;
+ int use_include_path = 0;
+ int issock=0, socketd=0;
+ TLS_VARS;
+
+ switch(ARG_COUNT(ht)) {
+ case 2:
+ if (getParameters(ht,2,&arg1,&arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ break;
+ case 3:
+ if (getParameters(ht,3,&arg1,&arg2,&arg3) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg3);
+ use_include_path = arg3->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg1);
+ convert_to_string(arg2);
+ p = estrndup(arg2->value.str.val,arg2->value.str.len);
+
+ /*
+ * We need a better way of returning error messages from
+ * php3_fopen__wrapper().
+ */
+ fp = php3_fopen_wrapper(arg1->value.str.val, p, use_include_path|ENFORCE_SAFE_MODE, &issock, &socketd);
+ if (!fp && !socketd) {
+ if (issock != BAD_URL) {
+ php3_strip_url_passwd(arg1->value.str.val);
+ php3_error(E_WARNING,"fopen(\"%s\",\"%s\") - %s",
+ arg1->value.str.val, p, strerror(errno));
+ }
+ efree(p);
+ RETURN_FALSE;
+ }
+ GLOBAL(fgetss_state)=0;
+ if (issock) {
+ sock=emalloc(sizeof(int));
+ *sock=socketd;
+ id = php3_list_insert(sock,GLOBAL(wsa_fp));
+ } else {
+ id = php3_list_insert(fp,GLOBAL(le_fp));
+ }
+ efree(p);
+ RETURN_LONG(id);
+}
+/* }}} */
+
+/* {{{ proto int fclose(int fp)
+Close an open file pointer */
+void php3_fclose(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1;
+ int id, type;
+ FILE *fp;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg1);
+ id=arg1->value.lval;
+ fp = php3_list_find(id,&type);
+ if (!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(wsa_fp))) {
+ php3_error(E_WARNING,"Unable to find file identifier %d",id);
+ RETURN_FALSE;
+ }
+ php3_list_delete(id);
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int popen(string command, string mode)
+Execute a command and open either a read or a write pipe to it */
+void php3_popen(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1, *arg2;
+ FILE *fp;
+ int id;
+ char *p;
+ char *b, buf[1024];
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg1);
+ convert_to_string(arg2);
+ p = estrndup(arg2->value.str.val,arg2->value.str.len);
+ if (PG(safe_mode)){
+ b = strchr(arg1->value.str.val,' ');
+ if (!b) {
+ b = strrchr(arg1->value.str.val,'/');
+ } else {
+ char *c;
+ c = arg1->value.str.val;
+ while((*b!='/')&&(b!=c)) b--;
+ if (b==c) b=NULL;
+ }
+ if (b) {
+ snprintf(buf,sizeof(buf),"%s%s",PG(safe_mode_exec_dir),b);
+ } else {
+ snprintf(buf,sizeof(buf),"%s/%s",PG(safe_mode_exec_dir),arg1->value.str.val);
+ }
+ fp = popen(buf,p);
+ if (!fp) {
+ php3_error(E_WARNING,"popen(\"%s\",\"%s\") - %s",buf,p,strerror(errno));
+ RETURN_FALSE;
+ }
+ } else {
+ fp = popen(arg1->value.str.val,p);
+ if (!fp) {
+ php3_error(E_WARNING,"popen(\"%s\",\"%s\") - %s",arg1->value.str.val,p,strerror(errno));
+ efree(p);
+ RETURN_FALSE;
+ }
+ }
+/* #endif */
+ id = php3_list_insert(fp,GLOBAL(le_pp));
+ efree(p);
+ RETURN_LONG(id);
+}
+/* }}} */
+
+/* {{{ proto int pclose(int fp)
+Close a file pointer opened by popen() */
+void php3_pclose(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1;
+ int id,type;
+ FILE *fp;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg1);
+ id = arg1->value.lval;
+
+ fp = php3_list_find(id,&type);
+ if (!fp || type!=GLOBAL(le_pp)) {
+ php3_error(E_WARNING,"Unable to find pipe identifier %d",id);
+ RETURN_FALSE;
+ }
+ php3_list_delete(id);
+ RETURN_LONG(GLOBAL(pclose_ret));
+}
+/* }}} */
+
+/* {{{ proto int feof(int fp)
+Test for end-of-file on a file pointer */
+void php3_feof(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1;
+ FILE *fp;
+ int id, type;
+ int issock=0;
+ int socketd=0, *sock;
+ unsigned int temp;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg1);
+ id = arg1->value.lval;
+ fp = php3_list_find(id,&type);
+ if (type==GLOBAL(wsa_fp)){
+ issock=1;
+ sock = php3_list_find(id,&type);
+ socketd=*sock;
+ }
+ if ((!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) && (!socketd || type!=GLOBAL(wsa_fp))) {
+ php3_error(E_WARNING,"Unable to find file identifier %d",id);
+ /* we're at the eof if the file doesn't exist */
+ RETURN_TRUE;
+ }
+ if ((issock?!(recv(socketd,(char *)&temp,1,MSG_PEEK)):feof(fp))) {
+ RETURN_TRUE;
+ } else {
+ RETURN_FALSE;
+ }
+}
+/* }}} */
+
+/* {{{ proto int set_socket_blocking(int socket descriptor, int mode)
+Set blocking/non-blocking mode on a socket */
+void php3_set_socket_blocking(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg1, *arg2;
+ int id, type, block;
+ int flags;
+ int socketd=0, *sock;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg1);
+ convert_to_long(arg2);
+ id = arg1->value.lval;
+ block = arg2->value.lval;
+
+ sock = php3_list_find(id,&type);
+ if (type!=GLOBAL(wsa_fp)) {
+ php3_error(E_WARNING,"%d is not a socket id",id);
+ RETURN_FALSE;
+ }
+ socketd=*sock;
+#if WIN32|WINNT
+ /* with ioctlsocket, a non-zero sets nonblocking, a zero sets blocking */
+ flags=block;
+ if (ioctlsocket(socketd,FIONBIO,&flags)==SOCKET_ERROR){
+ php3_error(E_WARNING,"%s",WSAGetLastError());
+ RETURN_FALSE;
+ } else {
+ RETURN_TRUE;
+ }
+#else
+ flags = fcntl(socketd, F_GETFL);
+# ifdef O_NONBLOCK
+ /* POSIX version */
+ if (block) {
+ if ((flags & O_NONBLOCK)) {
+ flags ^= O_NONBLOCK;
+ }
+ } else {
+ if (!(flags & O_NONBLOCK)) {
+ flags |= O_NONBLOCK;
+ }
+ }
+# else
+# ifdef O_NDELAY
+ /* old non-POSIX version */
+ if (block) {
+ flags |= O_NDELAY;
+ } else {
+ flags ^= O_NDELAY;
+ }
+# endif
+# endif
+ fcntl(socketd,F_SETFL,flags);
+ /* FIXME: Shouldnt we return true on this function? */
+#endif
+}
+/* }}} */
+
+
+#if (0 && HAVE_SYS_TIME_H && HAVE_SETSOCKOPT && defined(SO_SNDTIMEO) && defined(SO_RCVTIMEO))
+/* this doesn't work, as it appears those properties are read-only :( */
+void php3_set_socket_timeout(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *socket,*timeout;
+ int type, *sock;
+ struct timeval t;
+
+ if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &socket, &timeout)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(socket);
+ convert_to_long(timeout);
+
+ sock = php3_list_find(socket->value.lval, &type);
+ if (type!=GLOBAL(wsa_fp)) {
+ php3_error(E_WARNING,"%d is not a socket id",socket->value.lval);
+ RETURN_FALSE;
+ }
+ t.tv_sec = timeout->value.lval;
+ t.tv_usec = 0;
+ setsockopt(*sock,SOL_SOCKET,SO_SNDTIMEO,(void *) &t,sizeof(struct timeval));
+ setsockopt(*sock,SOL_SOCKET,SO_RCVTIMEO,(void *) &t,sizeof(struct timeval));
+ RETURN_TRUE;
+}
+#endif
+
+/* {{{ proto string fgets(int fp, int length)
+Get a line from file pointer */
+void php3_fgets(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg1, *arg2;
+ FILE *fp;
+ int id, len, type;
+ char *buf;
+ int issock=0;
+ int *sock, socketd=0;
+ PLS_FETCH();
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg1);
+ convert_to_long(arg2);
+ id = arg1->value.lval;
+ len = arg2->value.lval;
+
+ fp = php3_list_find(id,&type);
+ if (type==GLOBAL(wsa_fp)){
+ issock=1;
+ sock = php3_list_find(id,&type);
+ socketd=*sock;
+ }
+ if ((!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) && (!socketd || type!=GLOBAL(wsa_fp))) {
+ php3_error(E_WARNING,"Unable to find file identifier %d",id);
+ RETURN_FALSE;
+ }
+ buf = emalloc(sizeof(char) * (len + 1));
+ /* needed because recv doesnt put a null at the end*/
+ memset(buf,0,len+1);
+ if (!(issock?SOCK_FGETS(buf,len,socketd):(int)fgets(buf,len,fp))) {
+ efree(buf);
+ RETVAL_FALSE;
+ } else {
+ if (PG(magic_quotes_runtime)) {
+ return_value->value.str.val = _php3_addslashes(buf,0,&return_value->value.str.len,1);
+ } else {
+ return_value->value.str.val = buf;
+ return_value->value.str.len = strlen(return_value->value.str.val);
+ }
+ return_value->type = IS_STRING;
+ }
+ return;
+}
+/* }}} */
+
+/* {{{ proto string fgetc(int fp)
+Get a character from file pointer */
+void php3_fgetc(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1;
+ FILE *fp;
+ int id, type;
+ char *buf;
+ int issock=0;
+ int *sock, socketd=0;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg1);
+ id = arg1->value.lval;
+
+ fp = php3_list_find(id,&type);
+ if (type==GLOBAL(wsa_fp)){
+ issock=1;
+ sock = php3_list_find(id,&type);
+ socketd = *sock;
+ }
+ if ((!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) && (!socketd || type!=GLOBAL(wsa_fp))) {
+ php3_error(E_WARNING,"Unable to find file identifier %d",id);
+ RETURN_FALSE;
+ }
+ buf = emalloc(sizeof(char) * 2);
+ if (!(issock?(SOCK_FGETC(buf,socketd)):(*buf=fgetc(fp)))) {
+ efree(buf);
+ RETVAL_FALSE;
+ } else {
+ buf[1]='\0';
+ return_value->value.str.val = buf;
+ return_value->value.str.len = 1;
+ return_value->type = IS_STRING;
+ }
+ return;
+}
+/* }}} */
+
+/* Strip any HTML tags while reading */
+/* {{{ proto string fgetss(int fp, int length)
+Get a line from file pointer and strip HTML tags */
+void php3_fgetss(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *fd, *bytes;
+ FILE *fp;
+ int id, len, br, type;
+ char *buf, *p, *rbuf, *rp, c, lc;
+ int issock=0;
+ int *sock,socketd=0;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &fd, &bytes) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_long(fd);
+ convert_to_long(bytes);
+
+ id = fd->value.lval;
+ len = bytes->value.lval;
+
+ fp = php3_list_find(id,&type);
+ if (type==GLOBAL(wsa_fp)){
+ issock=1;
+ sock = php3_list_find(id,&type);
+ socketd=*sock;
+ }
+ if ((!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) && (!socketd || type!=GLOBAL(wsa_fp))) {
+ php3_error(E_WARNING, "Unable to find file identifier %d", id);
+ RETURN_FALSE;
+ }
+
+ buf = emalloc(sizeof(char) * (len + 1));
+ /*needed because recv doesnt set null char at end*/
+ memset(buf,0,len+1);
+ if (!(issock?SOCK_FGETS(buf,len,socketd):(int)fgets(buf, len, fp))) {
+ efree(buf);
+ RETURN_FALSE;
+ }
+
+ rbuf = estrdup(buf);
+ c = *buf;
+ lc = '\0';
+ p = buf;
+ rp = rbuf;
+ br = 0;
+
+ while (c) {
+ switch (c) {
+ case '<':
+ if (GLOBAL(fgetss_state) == 0) {
+ lc = '<';
+ GLOBAL(fgetss_state) = 1;
+ }
+ break;
+
+ case '(':
+ if (GLOBAL(fgetss_state) == 2) {
+ if (lc != '\"') {
+ lc = '(';
+ br++;
+ }
+ } else if (GLOBAL(fgetss_state) == 0) {
+ *(rp++) = c;
+ }
+ break;
+
+ case ')':
+ if (GLOBAL(fgetss_state) == 2) {
+ if (lc != '\"') {
+ lc = ')';
+ br--;
+ }
+ } else if (GLOBAL(fgetss_state) == 0) {
+ *(rp++) = c;
+ }
+ break;
+
+ case '>':
+ if (GLOBAL(fgetss_state) == 1) {
+ lc = '>';
+ GLOBAL(fgetss_state) = 0;
+ } else if (GLOBAL(fgetss_state) == 2) {
+ if (!br && lc != '\"') {
+ GLOBAL(fgetss_state) = 0;
+ }
+ }
+ break;
+
+ case '\"':
+ if (GLOBAL(fgetss_state) == 2) {
+ if (lc == '\"') {
+ lc = '\0';
+ } else if (lc != '\\') {
+ lc = '\"';
+ }
+ } else if (GLOBAL(fgetss_state) == 0) {
+ *(rp++) = c;
+ }
+ break;
+
+ case '?':
+ if (GLOBAL(fgetss_state)==1) {
+ br=0;
+ GLOBAL(fgetss_state)=2;
+ break;
+ }
+ /* fall-through */
+
+ default:
+ if (GLOBAL(fgetss_state) == 0) {
+ *(rp++) = c;
+ }
+ }
+ c = *(++p);
+ }
+ *rp = '\0';
+ efree(buf);
+ RETVAL_STRING(rbuf,1);
+ efree(rbuf);
+}
+/* }}} */
+
+/* {{{ proto int fwrite(int fp, string str [, int length])
+Binary-safe file write */
+void php3_fwrite(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg1, *arg2, *arg3=NULL;
+ FILE *fp;
+ int ret,id,type;
+ int num_bytes;
+ int issock=0;
+ int *sock, socketd=0;
+ PLS_FETCH();
+
+ switch (ARG_COUNT(ht)) {
+ case 2:
+ if (getParameters(ht, 2, &arg1, &arg2)==FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_string(arg2);
+ num_bytes = arg2->value.str.len;
+ break;
+ case 3:
+ if (getParameters(ht, 3, &arg1, &arg2, &arg3)==FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_string(arg2);
+ convert_to_long(arg3);
+ num_bytes = MIN(arg3->value.lval, arg2->value.str.len);
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ /* NOTREACHED */
+ break;
+ }
+ convert_to_long(arg1);
+ id = arg1->value.lval;
+
+ fp = php3_list_find(id,&type);
+ if (type==GLOBAL(wsa_fp)){
+ issock=1;
+ sock = php3_list_find(id,&type);
+ socketd=*sock;
+ }
+ if ((!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) && (!socketd || type!=GLOBAL(wsa_fp))) {
+ php3_error(E_WARNING,"Unable to find file identifier %d",id);
+ RETURN_FALSE;
+ }
+
+ /* strip slashes only if the length wasn't specified explicitly */
+ if (!arg3 && PG(magic_quotes_runtime)) {
+ _php3_stripslashes(arg2->value.str.val,&num_bytes);
+ }
+
+ if (issock){
+ ret = SOCK_WRITEL(arg2->value.str.val,num_bytes,socketd);
+ } else {
+ ret = fwrite(arg2->value.str.val,1,num_bytes,fp);
+ }
+ RETURN_LONG(ret);
+}
+/* }}} */
+
+/* {{{ proto int rewind(int fp)
+Rewind the position of a file pointer */
+void php3_rewind(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1;
+ int id,type;
+ FILE *fp;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg1);
+ id = arg1->value.lval;
+ fp = php3_list_find(id,&type);
+ if (!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) {
+ php3_error(E_WARNING,"Unable to find file identifier %d",id);
+ RETURN_FALSE;
+ }
+ rewind(fp);
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int ftell(int fp)
+Get file pointer's read/write position */
+void php3_ftell(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1;
+ int id, type;
+ long pos;
+ FILE *fp;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg1);
+ id = arg1->value.lval;
+ fp = php3_list_find(id,&type);
+ if (!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) {
+ php3_error(E_WARNING,"Unable to find file identifier %d",id);
+ RETURN_FALSE;
+ }
+ pos = ftell(fp);
+ RETURN_LONG(pos);
+}
+/* }}} */
+
+/* {{{ proto int fseek(int fp, int offset)
+Seek on a file pointer */
+void php3_fseek(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1, *arg2;
+ int ret,id,type;
+ long pos;
+ FILE *fp;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg1);
+ convert_to_long(arg2);
+ pos = arg2->value.lval;
+ id = arg1->value.lval;
+ fp = php3_list_find(id,&type);
+ if (!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) {
+ php3_error(E_WARNING,"Unable to find file identifier %d",id);
+ RETURN_FALSE;
+ }
+/*fseek is flaky on windows, use setfilepointer, but we have to live with
+ it until we use win32 api for all the file functions in 3.1 */
+#if 0
+ ret = SetFilePointer (fp, pos, NULL, FILE_BEGIN);
+ if (ret == 0xFFFFFFFF){
+ php3_error(E_WARNING,"Unable to move file postition: %s",php3_win_err());
+ RETURN_FALSE;
+ }
+#else
+ ret = fseek(fp,pos,SEEK_SET);
+#endif
+ RETURN_LONG(ret);
+}
+/* }}} */
+
+/* {{{ proto int mkdir(string pathname, int mode)
+Create a directory */
+void php3_mkdir(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1, *arg2;
+ int ret,mode;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg1);
+ convert_to_long(arg2);
+ mode = arg2->value.lval;
+ if (PG(safe_mode) &&(!_php3_checkuid(arg1->value.str.val,3))) {
+ RETURN_FALSE;
+ }
+ ret = mkdir(arg1->value.str.val,mode);
+ if (ret < 0) {
+ php3_error(E_WARNING,"MkDir failed (%s)", strerror(errno));
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int rmdir(string dirname)
+Remove a directory */
+void php3_rmdir(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1;
+ int ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg1);
+ if (PG(safe_mode) &&(!_php3_checkuid(arg1->value.str.val,1))) {
+ RETURN_FALSE;
+ }
+ ret = rmdir(arg1->value.str.val);
+ if (ret < 0) {
+ php3_error(E_WARNING,"RmDir failed (%s)", strerror(errno));
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int readfile(string filename [, int use_include_path])
+Output a file or a URL */
+void php3_readfile(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1, *arg2;
+ char buf[8192];
+ FILE *fp;
+ int b, size;
+ int use_include_path = 0;
+
+ int issock=0, socketd=0;
+ TLS_VARS;
+
+ /* check args */
+ switch (ARG_COUNT(ht)) {
+ case 1:
+ if (getParameters(ht,1,&arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ break;
+ case 2:
+ if (getParameters(ht,2,&arg1,&arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg2);
+ use_include_path = arg2->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg1);
+
+ /*
+ * We need a better way of returning error messages from
+ * php3_fopen_wrapper().
+ */
+ fp = php3_fopen_wrapper(arg1->value.str.val,"r", use_include_path|ENFORCE_SAFE_MODE, &issock, &socketd);
+ if (!fp && !socketd){
+ if (issock != BAD_URL) {
+ php3_strip_url_passwd(arg1->value.str.val);
+ php3_error(E_WARNING,"ReadFile(\"%s\") - %s",arg1->value.str.val,strerror(errno));
+ }
+ RETURN_FALSE;
+ }
+ size= 0;
+ while(issock?(b=SOCK_FGETS(buf,sizeof(buf),socketd)):(b = fread(buf, 1, sizeof(buf), fp)) > 0) {
+ PHPWRITE(buf,b);
+ size += b ;
+ }
+ if (issock) {
+#if WIN32|WINNT
+ closesocket(socketd);
+#else
+ close(socketd);
+#endif
+ } else {
+ fclose(fp);
+ }
+ RETURN_LONG(size);
+}
+/* }}} */
+
+/* {{{ proto int umask([int mask])
+Return or change the umask */
+void php3_fileumask(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1;
+ int oldumask;
+ int arg_count = ARG_COUNT(ht);
+ TLS_VARS;
+
+ oldumask = umask(077);
+
+ if (arg_count == 0) {
+ umask(oldumask);
+ }
+ else {
+ if (arg_count > 1 || getParameters(ht, 1, &arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg1);
+ umask(arg1->value.lval);
+ }
+ RETURN_LONG(oldumask);
+}
+/* }}} */
+
+/*
+ * Read to EOF on a file descriptor and write the output to stdout.
+ */
+/* {{{ proto int fpassthru(int fp)
+Output all remaining data from a file pointer */
+void php3_fpassthru(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *arg1;
+ FILE *fp;
+ char buf[8192];
+ int id, size, b, type;
+ int issock=0;
+ int socketd=0, *sock;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg1);
+ id = arg1->value.lval;
+ fp = php3_list_find(id,&type);
+ if (type==GLOBAL(wsa_fp)){
+ issock=1;
+ sock = php3_list_find(id,&type);
+ socketd=*sock;
+ }
+ if ((!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) && (!socketd || type!=GLOBAL(wsa_fp))) {
+ php3_error(E_WARNING,"Unable to find file identifier %d",id);
+ RETURN_FALSE;
+ }
+ size = 0;
+ if (php3_header()) { /* force headers if not already sent */
+ while(issock?(b=SOCK_FGETS(buf,sizeof(buf),socketd)):(b = fread(buf, 1, sizeof(buf), fp)) > 0) {
+ PHPWRITE(buf,b);
+ size += b ;
+ }
+ }
+/*
+ if (issock) {
+#if WIN32|WINNT
+ closesocket(socketd);
+#else
+ close(socketd);
+#endif
+ } else {
+ fclose(fp);
+ }
+*/
+ php3_list_delete(id);
+ RETURN_LONG(size);
+}
+/* }}} */
+
+/* {{{ proto int rename(string old_name, string new_name)
+Rename a file */
+void php3_rename(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *OLD, *NEW;
+ char *old, *new;
+ int ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &OLD, &NEW) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(OLD);
+ convert_to_string(NEW);
+
+ old = OLD->value.str.val;
+ new = NEW->value.str.val;
+
+ if (PG(safe_mode) &&(!_php3_checkuid(old,2))) {
+ RETURN_FALSE;
+ }
+ ret = rename(old, new);
+
+ if (ret == -1) {
+ php3_error(E_WARNING,
+ "Rename failed (%s)", strerror(errno));
+ RETURN_FALSE;
+ }
+
+ RETVAL_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int copy(string source_file, string destination_file)
+Copy a file */
+void php3_file_copy(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *source, *target;
+ char buffer[8192];
+ int fd_s,fd_t,read_bytes;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &source, &target) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(source);
+ convert_to_string(target);
+
+ if (PG(safe_mode) &&(!_php3_checkuid(source->value.str.val,2))) {
+ RETURN_FALSE;
+ }
+
+#if WIN32|WINNT
+ if ((fd_s=open(source->value.str.val,O_RDONLY|_O_BINARY))==-1) {
+#else
+ if ((fd_s=open(source->value.str.val,O_RDONLY))==-1) {
+#endif
+ php3_error(E_WARNING,"Unable to open '%s' for reading: %s",source->value.str.val,strerror(errno));
+ RETURN_FALSE;
+ }
+#if WIN32|WINNT
+ if ((fd_t=open(target->value.str.val,_O_WRONLY|_O_CREAT|_O_TRUNC|_O_BINARY,_S_IREAD|_S_IWRITE))==-1){
+#else
+ if ((fd_t=creat(target->value.str.val,0777))==-1) {
+#endif
+ php3_error(E_WARNING,"Unable to create '%s': %s", target->value.str.val,strerror(errno));
+ close(fd_s);
+ RETURN_FALSE;
+ }
+
+ while ((read_bytes=read(fd_s,buffer,8192))!=-1 && read_bytes!=0) {
+ if (write(fd_t,buffer,read_bytes)==-1) {
+ php3_error(E_WARNING,"Unable to write to '%s': %s",target->value.str.val,strerror(errno));
+ close(fd_s);
+ close(fd_t);
+ RETURN_FALSE;
+ }
+ }
+
+ close(fd_s);
+ close(fd_t);
+
+ RETVAL_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int fread(int fp, int length)
+Binary-safe file read */
+void php3_fread(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg1, *arg2;
+ FILE *fp;
+ int id, len, type;
+ int issock=0;
+ int *sock, socketd=0;
+ PLS_FETCH();
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg1);
+ convert_to_long(arg2);
+ id = arg1->value.lval;
+ len = arg2->value.lval;
+
+ fp = php3_list_find(id,&type);
+ if (type==GLOBAL(wsa_fp)){
+ issock=1;
+ sock = php3_list_find(id,&type);
+ socketd=*sock;
+ }
+ if ((!fp || (type!=GLOBAL(le_fp) && type!=GLOBAL(le_pp))) && (!socketd || type!=GLOBAL(wsa_fp))) {
+ php3_error(E_WARNING,"Unable to find file identifier %d",id);
+ RETURN_FALSE;
+ }
+ return_value->value.str.val = emalloc(sizeof(char) * (len + 1));
+ /* needed because recv doesnt put a null at the end*/
+
+ if (!issock) {
+ return_value->value.str.len = fread(return_value->value.str.val, 1, len, fp);
+ return_value->value.str.val[return_value->value.str.len] = 0;
+ } else {
+ return_value->value.str.len = _php3_sock_fread(return_value->value.str.val, len, socketd);
+ }
+ if (PG(magic_quotes_runtime)) {
+ return_value->value.str.val = _php3_addslashes(return_value->value.str.val,return_value->value.str.len,&return_value->value.str.len,1);
+ }
+ return_value->type = IS_STRING;
+}
+/* }}} */
+
+/* aparently needed for pdf to be compiled as a module under windows */
+PHPAPI int php3i_get_le_fp(void){
+ TLS_VARS;
+ return GLOBAL(le_fp);
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * End:
+ */
diff --git a/ext/standard/file.h b/ext/standard/file.h
new file mode 100644
index 0000000000..08f1440f13
--- /dev/null
+++ b/ext/standard/file.h
@@ -0,0 +1,65 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#ifndef _FILE_H
+#define _FILE_H
+
+extern php3_module_entry php3_file_module_entry;
+#define php3_file_module_ptr &php3_file_module_entry
+
+extern int php3_minit_file(INIT_FUNC_ARGS);
+extern void php3_tempnam(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fopen(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fclose(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_popen(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_pclose(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_feof(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fread(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fgetc(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fgets(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fgetss(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fwrite(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_rewind(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_ftell(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fseek(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_mkdir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_rmdir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fpassthru(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_readfile(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fileumask(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_rename(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_file_copy(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_file(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_set_socket_blocking(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_set_socket_timeout(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_get_meta_tags(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _FILE_H */
diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c
new file mode 100644
index 0000000000..9b4810f1cc
--- /dev/null
+++ b/ext/standard/filestat.c
@@ -0,0 +1,509 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Author: Jim Winstead <jimw@php.net> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "safe_mode.h"
+#include "fopen-wrappers.h"
+#include "php_globals.h"
+
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <time.h>
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_PWD_H
+# if MSVC5
+# include "win32/pwd.h"
+# else
+# include <pwd.h>
+# endif
+#endif
+
+#if HAVE_GRP_H
+# if MSVC5
+# include "win32/grp.h"
+# else
+# include <grp.h>
+# endif
+#endif
+
+#if HAVE_UTIME
+# if MSVC5
+# include <sys/utime.h>
+# else
+# include <utime.h>
+# endif
+#endif
+
+#include "php3_filestat.h"
+
+#ifndef THREAD_SAFE
+static char *CurrentStatFile=NULL;
+# if MSVC5
+static unsigned int CurrentStatLength=0;
+# else
+static int CurrentStatLength=0;
+# endif
+static struct stat sb;
+#if HAVE_SYMLINK
+static struct stat lsb;
+#endif
+#endif
+
+#ifndef S_ISDIR
+#define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR)
+#endif
+#ifndef S_ISREG
+#define S_ISREG(mode) (((mode)&S_IFMT) == S_IFREG)
+#endif
+#ifndef S_ISLNK
+#define S_ISLNK(mode) (((mode)&S_IFMT) == S_IFLNK)
+#endif
+
+
+int php3_init_filestat(INIT_FUNC_ARGS)
+{
+ TLS_VARS;
+
+ GLOBAL(CurrentStatFile)=NULL;
+ GLOBAL(CurrentStatLength)=0;
+ return SUCCESS;
+}
+
+
+int php3_shutdown_filestat(SHUTDOWN_FUNC_ARGS)
+{
+ TLS_VARS;
+
+ if (GLOBAL(CurrentStatFile))
+ efree (GLOBAL(CurrentStatFile));
+ return SUCCESS;
+}
+
+void php3_chgrp(INTERNAL_FUNCTION_PARAMETERS)
+{
+#ifndef WINDOWS
+ pval *filename, *group;
+ gid_t gid;
+ struct group *gr=NULL;
+#endif
+ int ret;
+ TLS_VARS;
+ ret = 0;
+#ifndef WINDOWS
+
+ if (ARG_COUNT(ht)!=2 || getParameters(ht,2,&filename,&group)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(filename);
+ if (group->type == IS_STRING) {
+ gr = getgrnam(group->value.str.val);
+ if (!gr) {
+ php3_error(E_WARNING, "unable to find gid for %s",
+ group->value.str.val);
+ RETURN_FALSE;
+ }
+ gid = gr->gr_gid;
+ } else {
+ convert_to_long(group);
+ gid = group->value.lval;
+ }
+
+/* #if PHP_SAFE_MODE */
+ if (PG(safe_mode) &&(!_php3_checkuid(filename->value.str.val, 1))) {
+ RETURN_FALSE;
+ }
+/* #endif */
+
+ /* Check the basedir */
+ if (_php3_check_open_basedir(filename->value.str.val)) RETURN_FALSE;
+
+ ret = chown(filename->value.str.val, -1, gid);
+ if (ret == -1) {
+ php3_error(E_WARNING, "chgrp failed: %s", strerror(errno));
+ RETURN_FALSE;
+ }
+#endif
+ RETURN_TRUE;
+}
+
+void php3_chown(INTERNAL_FUNCTION_PARAMETERS)
+{
+#ifndef WINDOWS
+ pval *filename, *user;
+ int ret;
+ uid_t uid;
+ struct passwd *pw = NULL;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht)!=2 || getParameters(ht,2,&filename,&user)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(filename);
+ if (user->type == IS_STRING) {
+ pw = getpwnam(user->value.str.val);
+ if (!pw) {
+ php3_error(E_WARNING, "unable to find uid for %s",
+ user->value.str.val);
+ RETURN_FALSE;
+ }
+ uid = pw->pw_uid;
+ } else {
+ convert_to_long(user);
+ uid = user->value.lval;
+ }
+
+ if (PG(safe_mode) &&(!_php3_checkuid(filename->value.str.val, 1))) {
+ RETURN_FALSE;
+ }
+
+ /* Check the basedir */
+ if (_php3_check_open_basedir(filename->value.str.val)) RETURN_FALSE;
+
+ ret = chown(filename->value.str.val, uid, -1);
+ if (ret == -1) {
+ php3_error(E_WARNING, "chown failed: %s", strerror(errno));
+ RETURN_FALSE;
+ }
+#else
+ TLS_VARS;
+#endif
+ RETURN_TRUE;
+}
+
+void php3_chmod(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *filename, *mode;
+ int ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht)!=2 || getParameters(ht,2,&filename,&mode)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(filename);
+ convert_to_long(mode);
+
+ if (PG(safe_mode) &&(!_php3_checkuid(filename->value.str.val, 1))) {
+ RETURN_FALSE;
+ }
+
+ /* Check the basedir */
+ if (_php3_check_open_basedir(filename->value.str.val)) RETURN_FALSE;
+
+ ret = chmod(filename->value.str.val, mode->value.lval);
+ if (ret == -1) {
+ php3_error(E_WARNING, "chmod failed: %s", strerror(errno));
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+}
+
+void php3_touch(INTERNAL_FUNCTION_PARAMETERS) {
+#if HAVE_UTIME
+ pval *filename, *filetime;
+ int ret;
+ struct stat sb;
+ FILE *file;
+ struct utimbuf *newtime = NULL;
+ int ac = ARG_COUNT(ht);
+ TLS_VARS;
+
+ if (ac == 1 && getParameters(ht,1,&filename) != FAILURE) {
+#ifndef HAVE_UTIME_NULL
+ newtime = (struct utimbuf *)emalloc(sizeof(struct utimbuf));
+ if (!newtime) {
+ php3_error(E_WARNING, "unable to emalloc memory for changing time");
+ return;
+ }
+ newtime->actime = time(NULL);
+ newtime->modtime = newtime->actime;
+#endif
+ } else if (ac == 2 && getParameters(ht,2,&filename,&filetime) != FAILURE) {
+ newtime = (struct utimbuf *)emalloc(sizeof(struct utimbuf));
+ if (!newtime) {
+ php3_error(E_WARNING, "unable to emalloc memory for changing time");
+ return;
+ }
+ convert_to_long(filetime);
+ newtime->actime = filetime->value.lval;
+ newtime->modtime = filetime->value.lval;
+ } else {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(filename);
+
+ if (PG(safe_mode) &&(!_php3_checkuid(filename->value.str.val, 1))) {
+ if (newtime) efree(newtime);
+ RETURN_FALSE;
+ }
+
+ /* Check the basedir */
+ if (_php3_check_open_basedir(filename->value.str.val)) RETURN_FALSE;
+
+ /* create the file if it doesn't exist already */
+ ret = stat(filename->value.str.val, &sb);
+ if (ret == -1) {
+ file = fopen(filename->value.str.val, "w");
+ if (file == NULL) {
+ php3_error(E_WARNING, "unable to create file %s because %s", filename->value.str.val, strerror(errno));
+ if (newtime) efree(newtime);
+ RETURN_FALSE;
+ }
+ fclose(file);
+ }
+
+ ret = utime(filename->value.str.val, newtime);
+ if (newtime) efree(newtime);
+ if (ret == -1) {
+ php3_error(E_WARNING, "utime failed: %s", strerror(errno));
+ RETURN_FALSE;
+ } else {
+ RETURN_TRUE;
+ }
+#endif
+}
+
+void php3_clearstatcache(INTERNAL_FUNCTION_PARAMETERS) {
+ TLS_VARS;
+
+ if (GLOBAL(CurrentStatFile)) {
+ efree(GLOBAL(CurrentStatFile));
+ GLOBAL(CurrentStatFile) = NULL;
+ }
+}
+
+static void _php3_stat(const char *filename, int type, pval *return_value)
+{
+ struct stat *stat_sb = &GLOBAL(sb);
+ TLS_VARS;
+
+ if (!GLOBAL(CurrentStatFile) || strcmp(filename,GLOBAL(CurrentStatFile))) {
+ if (!GLOBAL(CurrentStatFile)
+ || strlen(filename) > GLOBAL(CurrentStatLength)) {
+ if (GLOBAL(CurrentStatFile)) efree(GLOBAL(CurrentStatFile));
+ GLOBAL(CurrentStatLength) = strlen(filename);
+ GLOBAL(CurrentStatFile) = estrndup(filename,GLOBAL(CurrentStatLength));
+ } else {
+ strcpy(GLOBAL(CurrentStatFile),filename);
+ }
+#if HAVE_SYMLINK
+ GLOBAL(lsb).st_mode = 0; /* mark lstat buf invalid */
+#endif
+ if (stat(GLOBAL(CurrentStatFile),&GLOBAL(sb))==-1) {
+ if (type != 15 || errno != ENOENT) { /* fileexists() test must print no error */
+ php3_error(E_NOTICE,"stat failed for %s (errno=%d - %s)",GLOBAL(CurrentStatFile),errno,strerror(errno));
+ }
+ efree(GLOBAL(CurrentStatFile));
+ GLOBAL(CurrentStatFile)=NULL;
+ RETURN_FALSE;
+ }
+ }
+
+#if HAVE_SYMLINK
+ if (8 == type /* filetype */
+ || 14 == type /* is link */
+ || 16 == type) { /* lstat */
+
+ /* do lstat if the buffer is empty */
+
+ if (!GLOBAL(lsb).st_mode) {
+ if (lstat(GLOBAL(CurrentStatFile),&GLOBAL(lsb)) == -1) {
+ php3_error(E_NOTICE,"lstat failed for %s (errno=%d - %s)",GLOBAL(CurrentStatFile),errno,strerror(errno));
+ RETURN_FALSE;
+ }
+ }
+ }
+#endif
+
+ switch(type) {
+ case 0: /* fileperms */
+ RETURN_LONG((long)GLOBAL(sb).st_mode);
+ case 1: /* fileinode */
+ RETURN_LONG((long)GLOBAL(sb).st_ino);
+ case 2: /* filesize */
+ RETURN_LONG((long)GLOBAL(sb).st_size);
+ case 3: /* fileowner */
+ RETURN_LONG((long)GLOBAL(sb).st_uid);
+ case 4: /* filegroup */
+ RETURN_LONG((long)GLOBAL(sb).st_gid);
+ case 5: /* fileatime */
+ RETURN_LONG((long)GLOBAL(sb).st_atime);
+ case 6: /* filemtime */
+ RETURN_LONG((long)GLOBAL(sb).st_mtime);
+ case 7: /* filectime */
+ RETURN_LONG((long)GLOBAL(sb).st_ctime);
+ case 8: /* filetype */
+#if HAVE_SYMLINK
+ if (S_ISLNK(GLOBAL(lsb).st_mode)) {
+ RETURN_STRING("link",1);
+ }
+#endif
+ switch(GLOBAL(sb).st_mode&S_IFMT) {
+ case S_IFIFO: RETURN_STRING("fifo",1);
+ case S_IFCHR: RETURN_STRING("char",1);
+ case S_IFDIR: RETURN_STRING("dir",1);
+ case S_IFBLK: RETURN_STRING("block",1);
+ case S_IFREG: RETURN_STRING("file",1);
+ }
+ php3_error(E_WARNING,"Unknown file type (%d)",GLOBAL(sb).st_mode&S_IFMT);
+ RETURN_STRING("unknown",1);
+ case 9: /*is writable*/
+ RETURN_LONG((GLOBAL(sb).st_mode&S_IWRITE)!=0);
+ case 10: /*is readable*/
+ RETURN_LONG((GLOBAL(sb).st_mode&S_IREAD)!=0);
+ case 11: /*is executable*/
+ RETURN_LONG((GLOBAL(sb).st_mode&S_IEXEC)!=0 && !S_ISDIR(GLOBAL(sb).st_mode));
+ case 12: /*is file*/
+ RETURN_LONG(S_ISREG(GLOBAL(sb).st_mode));
+ case 13: /*is dir*/
+ RETURN_LONG(S_ISDIR(GLOBAL(sb).st_mode));
+ case 14: /*is link*/
+#if HAVE_SYMLINK
+ RETURN_LONG(S_ISLNK(GLOBAL(lsb).st_mode));
+#else
+ RETURN_FALSE;
+#endif
+ case 15: /*file exists*/
+ RETURN_TRUE; /* the false case was done earlier */
+ case 16: /* lstat */
+#if HAVE_SYMLINK
+ stat_sb = &GLOBAL(lsb);
+#endif
+ /* FALLTHROUGH */
+ case 17: /* stat */
+ if (array_init(return_value) == FAILURE) {
+ RETURN_FALSE;
+ }
+ add_next_index_long(return_value, stat_sb->st_dev);
+ add_next_index_long(return_value, stat_sb->st_ino);
+ add_next_index_long(return_value, stat_sb->st_mode);
+ add_next_index_long(return_value, stat_sb->st_nlink);
+ add_next_index_long(return_value, stat_sb->st_uid);
+ add_next_index_long(return_value, stat_sb->st_gid);
+#ifdef HAVE_ST_BLKSIZE
+ add_next_index_long(return_value, stat_sb->st_rdev);
+#else
+ add_next_index_long(return_value, -1);
+#endif
+ add_next_index_long(return_value, stat_sb->st_size);
+ add_next_index_long(return_value, stat_sb->st_atime);
+ add_next_index_long(return_value, stat_sb->st_mtime);
+ add_next_index_long(return_value, stat_sb->st_ctime);
+#if HAVE_ST_BLKSIZE
+ add_next_index_long(return_value, stat_sb->st_blksize);
+#else
+ add_next_index_long(return_value, -1);
+#endif
+#if HAVE_ST_BLOCKS
+ add_next_index_long(return_value, stat_sb->st_blocks);
+#else
+ add_next_index_long(return_value, -1);
+#endif
+ return;
+ }
+ php3_error(E_WARNING, "didn't understand stat call");
+ RETURN_FALSE;
+}
+
+/* another quickie macro to make defining similar functions easier */
+#define FileFunction(name, funcnum) \
+void name(INTERNAL_FUNCTION_PARAMETERS) { \
+ pval *filename; \
+ if (ARG_COUNT(ht)!=1 || getParameters(ht,1,&filename) == FAILURE) { \
+ WRONG_PARAM_COUNT; \
+ } \
+ convert_to_string(filename); \
+ _php3_stat(filename->value.str.val, funcnum, return_value); \
+}
+
+FileFunction(php3_fileperms,0)
+FileFunction(php3_fileinode,1)
+FileFunction(php3_filesize, 2)
+FileFunction(php3_fileowner,3)
+FileFunction(php3_filegroup,4)
+FileFunction(php3_fileatime,5)
+FileFunction(php3_filemtime,6)
+FileFunction(php3_filectime,7)
+FileFunction(php3_filetype, 8)
+FileFunction(php3_iswritable, 9)
+FileFunction(php3_isreadable,10)
+FileFunction(php3_isexec,11)
+FileFunction(php3_isfile,12)
+FileFunction(php3_isdir,13)
+FileFunction(php3_islink,14)
+FileFunction(php3_fileexists,15)
+FileFunction(php3_lstat,16)
+FileFunction(php3_stat,17)
+
+function_entry php3_filestat_functions[] = {
+ {"fileatime", php3_fileatime, NULL},
+ {"filectime", php3_filectime, NULL},
+ {"filegroup", php3_filegroup, NULL},
+ {"fileinode", php3_fileinode, NULL},
+ {"filemtime", php3_filemtime, NULL},
+ {"fileowner", php3_fileowner, NULL},
+ {"fileperms", php3_fileperms, NULL},
+ {"filesize", php3_filesize, NULL},
+ {"filetype", php3_filetype, NULL},
+ {"file_exists", php3_fileexists, NULL},
+ {"is_writeable",php3_iswritable, NULL},
+ {"is_readable", php3_isreadable, NULL},
+ {"is_executable",php3_isexec, NULL},
+ {"is_file", php3_isfile, NULL},
+ {"is_dir", php3_isdir, NULL},
+ {"is_link", php3_islink, NULL},
+ {"stat", php3_stat, NULL},
+ {"lstat", php3_lstat, NULL},
+ {"chown", php3_chown, NULL},
+ {"chgrp", php3_chgrp, NULL},
+ {"chmod", php3_chmod, NULL},
+ {"touch", php3_touch, NULL},
+ {NULL, NULL, NULL}
+};
+
+
+php3_module_entry php3_filestat_module_entry = {
+ "PHP_filestat", php3_filestat_functions, NULL, NULL, php3_init_filestat, php3_shutdown_filestat, NULL, STANDARD_MODULE_PROPERTIES
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/formatted_print.c b/ext/standard/formatted_print.c
new file mode 100644
index 0000000000..d6e3f3326f
--- /dev/null
+++ b/ext/standard/formatted_print.c
@@ -0,0 +1,602 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Stig Sæther Bakken <ssb@guardian.no> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#include <math.h> /* modf() */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "head.h"
+#include "php3_string.h"
+#include "zend_execute.h"
+#include <stdio.h>
+
+#define ALIGN_LEFT 0
+#define ALIGN_RIGHT 1
+#define ADJ_WIDTH 1
+#define ADJ_PRECISION 2
+#define NUM_BUF_SIZE 500
+#define NDIG 80
+#define FLOAT_DIGITS 6
+#define FLOAT_PRECISION 6
+#define MAX_FLOAT_DIGITS 38
+#define MAX_FLOAT_PRECISION 40
+
+#if 0
+/* trick to control varargs functions through cpp */
+# define PRINTF_DEBUG(arg) php3_printf arg
+#else
+# define PRINTF_DEBUG(arg)
+#endif
+
+static char hexchars[] = "0123456789abcdef";
+static char HEXCHARS[] = "0123456789ABCDEF";
+
+
+/*
+ * cvt.c - IEEE floating point formatting routines for FreeBSD
+ * from GNU libc-4.6.27
+ */
+
+/*
+ * _php3_cvt converts to decimal
+ * the number of digits is specified by ndigit
+ * decpt is set to the position of the decimal point
+ * sign is set to 0 for positive, 1 for negative
+ */
+static char *
+_php3_cvt(double arg, int ndigits, int *decpt, int *sign, int eflag)
+{
+ register int r2;
+ double fi, fj;
+ register char *p, *p1;
+ /*THREADX*/
+#ifndef THREAD_SAFE
+ static char cvt_buf[NDIG];
+#endif
+ TLS_VARS;
+
+ if (ndigits >= NDIG - 1)
+ ndigits = NDIG - 2;
+ r2 = 0;
+ *sign = 0;
+ p = &STATIC(cvt_buf)[0];
+ if (arg < 0) {
+ *sign = 1;
+ arg = -arg;
+ }
+ arg = modf(arg, &fi);
+ p1 = &STATIC(cvt_buf)[NDIG];
+ /*
+ * Do integer part
+ */
+ if (fi != 0) {
+ p1 = &STATIC(cvt_buf)[NDIG];
+ while (fi != 0) {
+ fj = modf(fi / 10, &fi);
+ *--p1 = (int) ((fj + .03) * 10) + '0';
+ r2++;
+ }
+ while (p1 < &STATIC(cvt_buf)[NDIG])
+ *p++ = *p1++;
+ } else if (arg > 0) {
+ while ((fj = arg * 10) < 1) {
+ arg = fj;
+ r2--;
+ }
+ }
+ p1 = &STATIC(cvt_buf)[ndigits];
+ if (eflag == 0)
+ p1 += r2;
+ *decpt = r2;
+ if (p1 < &STATIC(cvt_buf)[0]) {
+ STATIC(cvt_buf)[0] = '\0';
+ return (STATIC(cvt_buf));
+ }
+ while (p <= p1 && p < &STATIC(cvt_buf)[NDIG]) {
+ arg *= 10;
+ arg = modf(arg, &fj);
+ *p++ = (int) fj + '0';
+ }
+ if (p1 >= &STATIC(cvt_buf)[NDIG]) {
+ STATIC(cvt_buf)[NDIG - 1] = '\0';
+ return (STATIC(cvt_buf));
+ }
+ p = p1;
+ *p1 += 5;
+ while (*p1 > '9') {
+ *p1 = '0';
+ if (p1 > STATIC(cvt_buf))
+ ++ * --p1;
+ else {
+ *p1 = '1';
+ (*decpt)++;
+ if (eflag == 0) {
+ if (p > STATIC(cvt_buf))
+ *p = '0';
+ p++;
+ }
+ }
+ }
+ *p = '\0';
+ return (STATIC(cvt_buf));
+}
+
+
+inline static void
+_php3_sprintf_appendchar(char **buffer, int *pos, int *size, char add)
+{
+ if ((*pos + 1) >= *size) {
+ *size <<= 1;
+ PRINTF_DEBUG(("%s: ereallocing buffer to %d bytes\n", get_active_function_name(), *size));
+ *buffer = erealloc(*buffer, *size);
+ }
+ PRINTF_DEBUG(("sprintf: appending '%c', pos=\n", add, *pos));
+ (*buffer)[(*pos)++] = add;
+}
+
+
+inline static void
+_php3_sprintf_appendstring(char **buffer, int *pos, int *size, char *add,
+ int min_width, int max_width, char padding,
+ int alignment, int len)
+{
+ register int npad = min_width - MIN(len,(max_width?max_width:len));
+
+ if (npad<0) {
+ npad=0;
+ }
+
+ PRINTF_DEBUG(("sprintf: appendstring(%x, %d, %d, \"%s\", %d, '%c', %d)\n",
+ *buffer, *pos, *size, add, min_width, padding, alignment));
+ if (max_width == 0) {
+ max_width = MAX(min_width,len);
+ }
+ if ((*pos + max_width) >= *size) {
+ while ((*pos + max_width) >= *size) {
+ *size <<= 1;
+ }
+ PRINTF_DEBUG(("sprintf ereallocing buffer to %d bytes\n", *size));
+ *buffer = erealloc(*buffer, *size);
+ }
+ if (alignment == ALIGN_RIGHT) {
+ while (npad-- > 0) {
+ (*buffer)[(*pos)++] = padding;
+ }
+ }
+ PRINTF_DEBUG(("sprintf: appending \"%s\"\n", add));
+ strncpy(&(*buffer)[*pos], add, max_width);
+ *pos += MIN(max_width,len);
+ if (alignment == ALIGN_LEFT) {
+ while (npad--) {
+ (*buffer)[(*pos)++] = padding;
+ }
+ }
+}
+
+
+inline static void
+_php3_sprintf_appendint(char **buffer, int *pos, int *size, int number,
+ int width, char padding, int alignment)
+{
+ char numbuf[NUM_BUF_SIZE];
+ register unsigned int magn, nmagn, i = NUM_BUF_SIZE - 1, neg = 0;
+
+ PRINTF_DEBUG(("sprintf: appendint(%x, %x, %x, %d, %d, '%c', %d)\n",
+ *buffer, pos, size, number, width, padding, alignment));
+ if (number < 0) {
+ neg = 1;
+ magn = ((unsigned int) -(number + 1)) + 1;
+ } else {
+ magn = (unsigned int) number;
+ }
+
+ numbuf[i] = '\0';
+
+ do {
+ nmagn = magn / 10;
+
+ numbuf[--i] = (magn - (nmagn * 10)) + '0';
+ magn = nmagn;
+ }
+ while (magn > 0 && i > 0);
+ if (neg) {
+ numbuf[--i] = '-';
+ }
+ PRINTF_DEBUG(("sprintf: appending %d as \"%s\", i=%d\n",
+ number, &numbuf[i], i));
+ _php3_sprintf_appendstring(buffer, pos, size, &numbuf[i], width, 0,
+ padding, alignment, (NUM_BUF_SIZE - 1) - i);
+}
+
+
+inline static void
+_php3_sprintf_appenddouble(char **buffer, int *pos,
+ int *size, double number,
+ int width, char padding,
+ int alignment, int precision,
+ int adjust, char fmt)
+{
+ char numbuf[NUM_BUF_SIZE];
+ char *cvt;
+ register int i = 0, j = 0;
+ int sign, decpt;
+
+ PRINTF_DEBUG(("sprintf: appenddouble(%x, %x, %x, %f, %d, '%c', %d, %c)\n",
+ *buffer, pos, size, number, width, padding, alignment, fmt));
+ if ((adjust & ADJ_PRECISION) == 0) {
+ precision = FLOAT_PRECISION;
+ } else if (precision > MAX_FLOAT_PRECISION) {
+ precision = MAX_FLOAT_PRECISION;
+ }
+ cvt = _php3_cvt(number, precision, &decpt, &sign, (fmt == 'e'));
+
+ if (sign) {
+ numbuf[i++] = '-';
+ }
+
+ if (fmt == 'f') {
+ if (decpt <= 0) {
+ numbuf[i++] = '0';
+ if (precision > 0) {
+ int k = precision;
+ numbuf[i++] = '.';
+ while ((decpt++ < 0) && k--) {
+ numbuf[i++] = '0';
+ }
+ }
+ } else {
+ while (decpt-- > 0)
+ numbuf[i++] = cvt[j++];
+ if (precision > 0)
+ numbuf[i++] = '.';
+ }
+ } else {
+ numbuf[i++] = cvt[j++];
+ if (precision > 0)
+ numbuf[i++] = '.';
+ }
+
+ while (cvt[j]) {
+ numbuf[i++] = cvt[j++];
+ }
+
+ numbuf[i] = '\0';
+
+ if (precision > 0) {
+ width += (precision + 1);
+ }
+ _php3_sprintf_appendstring(buffer, pos, size, numbuf, width, 0, padding,
+ alignment, i);
+}
+
+
+inline static void
+_php3_sprintf_append2n(char **buffer, int *pos, int *size, int number,
+ int width, char padding, int alignment, int n,
+ char *chartable)
+{
+ char numbuf[NUM_BUF_SIZE];
+ register unsigned int num, i = NUM_BUF_SIZE - 1, neg = 0;
+ register int andbits = (1 << n) - 1;
+
+ PRINTF_DEBUG(("sprintf: append2n(%x, %x, %x, %d, %d, '%c', %d, %d, %x)\n",
+ *buffer, pos, size, number, width, padding, alignment, n,
+ chartable));
+ PRINTF_DEBUG(("sprintf: append2n 2^%d andbits=%x\n", n, andbits));
+
+ if (number < 0) {
+ neg = 1;
+ num = ((unsigned int) -(number + 1)) + 1;
+ } else {
+ num = (unsigned int) number;
+ }
+
+ numbuf[i] = '\0';
+
+ do {
+ numbuf[--i] = chartable[(num & andbits)];
+ num >>= n;
+ }
+ while (num > 0);
+
+ if (neg) {
+ numbuf[--i] = '-';
+ }
+ _php3_sprintf_appendstring(buffer, pos, size, &numbuf[i], width, 0,
+ padding, alignment, (NUM_BUF_SIZE - 1) - i);
+}
+
+
+inline static int
+_php3_sprintf_getnumber(char *buffer, int *pos)
+{
+ char *endptr;
+ register int num = strtol(&buffer[*pos], &endptr, 10);
+ register int i = 0;
+
+ if (endptr != NULL) {
+ i = (endptr - &buffer[*pos]);
+ }
+ PRINTF_DEBUG(("sprintf_getnumber: number was %d bytes long\n", i));
+ *pos += i;
+ return num;
+}
+
+
+/*
+ * New sprintf implementation for PHP.
+ *
+ * Modifiers:
+ *
+ * " " pad integers with spaces
+ * "-" left adjusted field
+ * n field size
+ * "."n precision (floats only)
+ *
+ * Type specifiers:
+ *
+ * "%" literal "%", modifiers are ignored.
+ * "b" integer argument is printed as binary
+ * "c" integer argument is printed as a single character
+ * "d" argument is an integer
+ * "f" the argument is a float
+ * "o" integer argument is printed as octal
+ * "s" argument is a string
+ * "x" integer argument is printed as lowercase hexadecimal
+ * "X" integer argument is printed as uppercase hexadecimal
+ *
+ */
+static char *
+php3_formatted_print(int ht, int *len)
+{
+ pval **args;
+ int argc, size = 240, inpos = 0, outpos = 0;
+ int alignment, width, precision, currarg, adjusting;
+ char *format, *result, padding;
+
+ argc = ARG_COUNT(ht);
+
+ if (argc < 1) {
+ WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
+ }
+ args = emalloc(argc * sizeof(pval *));
+
+ if (getParametersArray(ht, argc, args) == FAILURE) {
+ efree(args);
+ WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
+ }
+ convert_to_string(args[0]);
+ format = args[0]->value.str.val;
+ result = emalloc(size);
+
+ currarg = 1;
+
+ while (format[inpos]) {
+ PRINTF_DEBUG(("sprintf: format[%d]='%c'\n", inpos, format[inpos]));
+ PRINTF_DEBUG(("sprintf: outpos=%d\n", outpos));
+ if (format[inpos] != '%') {
+ _php3_sprintf_appendchar(&result, &outpos, &size, format[inpos++]);
+ } else if (format[inpos + 1] == '%') {
+ _php3_sprintf_appendchar(&result, &outpos, &size, '%');
+ inpos += 2;
+ } else {
+ if (currarg >= argc && format[inpos + 1] != '%') {
+ efree(result);
+ efree(args);
+ php3_error(E_WARNING, "%s(): too few arguments",get_active_function_name());
+ return NULL;
+ }
+ /* starting a new format specifier, reset variables */
+ alignment = ALIGN_RIGHT;
+ adjusting = 0;
+ padding = ' ';
+ inpos++; /* skip the '%' */
+
+ PRINTF_DEBUG(("sprintf: first looking at '%c', inpos=%d\n",
+ format[inpos], inpos));
+ if (isascii((int)format[inpos]) && !isalpha((int)format[inpos])) {
+ /* first look for modifiers */
+ PRINTF_DEBUG(("sprintf: looking for modifiers\n"
+ "sprintf: now looking at '%c', inpos=%d\n",
+ format[inpos], inpos));
+ for (;; inpos++) {
+ if (format[inpos] == ' ' || format[inpos] == '0') {
+ padding = format[inpos];
+ } else if (format[inpos] == '-') {
+ alignment = ALIGN_LEFT;
+ /* space padding, the default */
+ } else if (format[inpos] == '\'') {
+ padding = format[++inpos];
+ } else {
+ PRINTF_DEBUG(("sprintf: end of modifiers\n"));
+ break;
+ }
+ }
+ PRINTF_DEBUG(("sprintf: padding='%c'\n", padding));
+ PRINTF_DEBUG(("sprintf: alignment=%s\n",
+ (alignment == ALIGN_LEFT) ? "left" : "right"));
+
+
+ /* after modifiers comes width */
+ if (isdigit((int)format[inpos])) {
+ PRINTF_DEBUG(("sprintf: getting width\n"));
+ width = _php3_sprintf_getnumber(format, &inpos);
+ adjusting |= ADJ_WIDTH;
+ } else {
+ width = 0;
+ }
+ PRINTF_DEBUG(("sprintf: width=%d\n", width));
+
+ /* after width comes precision */
+ if (format[inpos] == '.') {
+ inpos++;
+ PRINTF_DEBUG(("sprintf: getting precision\n"));
+ if (isdigit((int)format[inpos])) {
+ precision = _php3_sprintf_getnumber(format, &inpos);
+ adjusting |= ADJ_PRECISION;
+ } else {
+ precision = 0;
+ }
+ } else {
+ precision = 0;
+ }
+ PRINTF_DEBUG(("sprintf: precision=%d\n", precision));
+ } else {
+ width = precision = 0;
+ }
+
+ if (format[inpos] == 'l') {
+ inpos++;
+ }
+ PRINTF_DEBUG(("sprintf: format character='%c'\n", format[inpos]));
+ /* now we expect to find a type specifier */
+ switch (format[inpos]) {
+ case 's':
+ convert_to_string(args[currarg]);
+ _php3_sprintf_appendstring(&result, &outpos, &size,
+ args[currarg]->value.str.val,
+ width, precision, padding,
+ alignment,
+ args[currarg]->value.str.len);
+ break;
+
+ case 'd':
+ convert_to_long(args[currarg]);
+ _php3_sprintf_appendint(&result, &outpos, &size,
+ args[currarg]->value.lval,
+ width, padding, alignment);
+ break;
+
+ case 'e':
+ case 'f':
+ /* XXX not done */
+ convert_to_double(args[currarg]);
+ _php3_sprintf_appenddouble(&result, &outpos, &size,
+ args[currarg]->value.dval,
+ width, padding, alignment,
+ precision, adjusting,
+ format[inpos]);
+ break;
+
+ case 'c':
+ convert_to_long(args[currarg]);
+ _php3_sprintf_appendchar(&result, &outpos, &size,
+ (char) args[currarg]->value.lval);
+ break;
+
+ case 'o':
+ convert_to_long(args[currarg]);
+ _php3_sprintf_append2n(&result, &outpos, &size,
+ args[currarg]->value.lval,
+ width, padding, alignment, 3,
+ hexchars);
+ break;
+
+ case 'x':
+ convert_to_long(args[currarg]);
+ _php3_sprintf_append2n(&result, &outpos, &size,
+ args[currarg]->value.lval,
+ width, padding, alignment, 4,
+ hexchars);
+ break;
+
+ case 'X':
+ convert_to_long(args[currarg]);
+ _php3_sprintf_append2n(&result, &outpos, &size,
+ args[currarg]->value.lval,
+ width, padding, alignment, 4,
+ HEXCHARS);
+ break;
+
+ case 'b':
+ convert_to_long(args[currarg]);
+ _php3_sprintf_append2n(&result, &outpos, &size,
+ args[currarg]->value.lval,
+ width, padding, alignment, 1,
+ hexchars);
+ break;
+
+ case '%':
+ _php3_sprintf_appendchar(&result, &outpos, &size, '%');
+
+ break;
+ default:
+ break;
+ }
+ currarg++;
+ inpos++;
+ }
+ }
+
+ efree(args);
+
+ /* possibly, we have to make sure we have room for the terminating null? */
+ result[outpos]=0;
+ *len = outpos;
+ return result;
+}
+
+
+PHP_FUNCTION(user_sprintf)
+{
+ char *result;
+ int len;
+ TLS_VARS;
+
+ if ((result=php3_formatted_print(ht,&len))==NULL) {
+ RETURN_FALSE;
+ }
+ RETVAL_STRINGL(result,len,1);
+ efree(result);
+}
+
+
+PHP_FUNCTION(user_printf)
+{
+ char *result;
+ int len;
+ TLS_VARS;
+
+ if ((result=php3_formatted_print(ht,&len))==NULL) {
+ RETURN_FALSE;
+ }
+ PHPWRITE(result,len);
+ efree(result);
+}
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c
new file mode 100644
index 0000000000..e1f7f3f177
--- /dev/null
+++ b/ext/standard/fsock.c
@@ -0,0 +1,477 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-1999 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Paul Panotzki - Bunyip Information Systems |
+ | Jim Winstead (jimw@php.net) |
+ +----------------------------------------------------------------------+
+*/
+/* $Id$ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <sys/types.h>
+#if HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef WIN32
+#include <winsock.h>
+#else
+#include <netinet/in.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+#endif
+#ifdef WIN32
+#undef AF_UNIX
+#endif
+#if defined(AF_UNIX)
+#include <sys/un.h>
+#endif
+
+#include <string.h>
+#include <errno.h>
+
+#include "base64.h"
+#include "file.h"
+#include "post.h"
+#include "url.h"
+#include "fsock.h"
+
+#ifndef THREAD_SAFE
+extern int le_fp;
+#endif
+
+#define FREE_SOCK if(socketd >= 0) close(socketd); efree(sock); if (key) efree(key)
+
+#if WIN32|WINNT
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#else
+#include "build-defs.h"
+#endif
+
+static unsigned char third_and_fourth_args_force_ref[] = { 4, BYREF_NONE, BYREF_NONE, BYREF_FORCE, BYREF_FORCE };
+
+function_entry fsock_functions[] = {
+ PHP_FE(fsockopen, third_and_fourth_args_force_ref)
+ PHP_FE(pfsockopen, third_and_fourth_args_force_ref)
+ {NULL, NULL, NULL}
+};
+
+struct php3i_sockbuf {
+ int socket;
+ char *readbuf;
+ size_t readbuflen;
+ size_t readpos;
+ size_t writepos;
+ struct php3i_sockbuf *next;
+};
+
+static struct php3i_sockbuf *phpsockbuf;
+
+static int php3_minit_fsock(INIT_FUNC_ARGS);
+static int php3_mshutdown_fsock(void);
+static int php3_rshutdown_fsock(void);
+
+php3_module_entry fsock_module_entry = {
+ "Socket functions", fsock_functions, php3_minit_fsock, php3_mshutdown_fsock, NULL, php3_rshutdown_fsock, NULL, STANDARD_MODULE_PROPERTIES
+};
+
+#ifndef THREAD_SAFE
+static HashTable ht_keys;
+static HashTable ht_socks;
+#endif
+
+/* {{{ lookup_hostname */
+
+/*
+ * Converts a host name to an IP address.
+ */
+int lookup_hostname(const char *addr, struct in_addr *in)
+{
+ struct hostent *host_info;
+
+ if(!inet_aton(addr, in)) {
+ host_info = gethostbyname(addr);
+ if (host_info == 0) {
+ /* Error: unknown host */
+ return -1;
+ }
+ *in = *((struct in_addr *) host_info->h_addr);
+ }
+ return 0;
+}
+/* }}} */
+/* {{{ _php3_is_persistent_sock */
+
+int _php3_is_persistent_sock(int sock)
+{
+ char *key;
+
+ if (_php3_hash_find(&ht_socks, (char *) &sock, sizeof(sock),
+ (void **) &key) == SUCCESS) {
+ return 1;
+ }
+ return 0;
+}
+/* }}} */
+/* {{{ _php3_fsockopen() */
+
+/*
+ This function takes an optional third argument which should be
+ passed by reference. The error code from the connect call is written
+ to this variable.
+*/
+static void _php3_fsockopen(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
+ pval *args[4];
+ int *sock=emalloc(sizeof(int));
+ int *sockp;
+ int id, arg_count=ARG_COUNT(ht);
+ int socketd = -1;
+ unsigned short portno;
+ char *key = NULL;
+ TLS_VARS;
+
+ if (arg_count > 4 || arg_count < 2 || getParametersArray(ht,arg_count,args)==FAILURE) {
+ FREE_SOCK;
+ WRONG_PARAM_COUNT;
+ }
+ switch(arg_count) {
+ case 4:
+ if(!ParameterPassedByReference(ht,4)) {
+ php3_error(E_WARNING,"error string argument to fsockopen not passed by reference");
+ }
+ pval_copy_constructor(args[3]);
+ args[3]->value.str.val = empty_string;
+ args[3]->value.str.len = 0;
+ args[3]->type = IS_STRING;
+ /* fall-through */
+ case 3:
+ if(!ParameterPassedByReference(ht,3)) {
+ php3_error(E_WARNING,"error argument to fsockopen not passed by reference");
+ }
+ args[2]->type = IS_LONG;
+ args[2]->value.lval = 0;
+ break;
+ }
+ convert_to_string(args[0]);
+ convert_to_long(args[1]);
+ portno = (unsigned short) args[1]->value.lval;
+
+ key = emalloc(args[0]->value.str.len + 10);
+ sprintf(key, "%s:%d", args[0]->value.str.val, portno);
+
+ if (persistent && _php3_hash_find(&ht_keys, key, strlen(key) + 1,
+ (void *) &sockp) == SUCCESS) {
+ efree(key);
+ *sock = *sockp;
+ RETURN_LONG(php3_list_insert(sock, GLOBAL(wsa_fp)));
+ }
+
+ if (portno) {
+ struct sockaddr_in server;
+
+ memset(&server, 0, sizeof(server));
+ socketd = socket(AF_INET, SOCK_STREAM, 0);
+ if (socketd == SOCK_ERR) {
+ FREE_SOCK;
+ RETURN_FALSE;
+ }
+
+ server.sin_family = AF_INET;
+
+ if (lookup_hostname(args[0]->value.str.val, &server.sin_addr)) {
+ FREE_SOCK;
+ RETURN_FALSE;
+ }
+
+ server.sin_port = htons(portno);
+
+ if (connect(socketd, (struct sockaddr *)&server, sizeof(server)) == SOCK_CONN_ERR) {
+ FREE_SOCK;
+ if(arg_count>2) args[2]->value.lval = errno;
+ if(arg_count>3) {
+ args[3]->value.str.val = estrdup(strerror(errno));
+ args[3]->value.str.len = strlen(args[3]->value.str.val);
+ }
+ RETURN_FALSE;
+ }
+#if defined(AF_UNIX)
+ } else {
+ /* Unix domain socket. s->strval is socket name. */
+ struct sockaddr_un unix_addr;
+ socketd = socket(AF_UNIX,SOCK_STREAM,0);
+ if (socketd == SOCK_ERR) {
+ FREE_SOCK;
+ RETURN_FALSE;
+ }
+
+ memset(&unix_addr,(char)0,sizeof(unix_addr));
+ unix_addr.sun_family = AF_UNIX;
+ strcpy(unix_addr.sun_path, args[0]->value.str.val);
+
+ if (connect(socketd, (struct sockaddr *) &unix_addr, sizeof(unix_addr)) == SOCK_CONN_ERR) {
+ FREE_SOCK;
+ if(arg_count>2) args[2]->value.lval = errno;
+ if(arg_count>3) {
+ args[3]->value.str.val = estrdup(strerror(errno));
+ args[3]->value.str.len = strlen(args[3]->value.str.val);
+ }
+ RETURN_FALSE;
+ }
+#endif /* AF_UNIX */
+ }
+
+#if 0
+ if ((fp = fdopen (socketd, "r+")) == NULL){
+ RETURN_LONG(-6); /* FIXME */
+ }
+
+#ifdef HAVE_SETVBUF
+ if ((setvbuf(fp, NULL, _IONBF, 0)) != 0){
+ RETURN_LONG(-7); /* FIXME */
+ }
+#endif
+#endif
+
+ *sock=socketd;
+ if (persistent) {
+ _php3_hash_update(&ht_keys, key, strlen(key) + 1,
+ sock, sizeof(*sock), NULL);
+ _php3_hash_update(&ht_socks, (char *) sock, sizeof(*sock),
+ key, strlen(key) + 1, NULL);
+ }
+ if(key) efree(key);
+ id = php3_list_insert(sock,GLOBAL(wsa_fp));
+ RETURN_LONG(id);
+}
+/* }}} */
+
+/* {{{ proto int fsockopen(string hostname, int port [, int errno [, string errstr]])
+ Open Internet or Unix domain socket connection */
+PHP_FUNCTION(fsockopen)
+{
+ _php3_fsockopen(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+/* {{{ proto int pfsockopen(string hostname, int port [, int errno [, string errstr]])
+ Open persistent Internet or Unix domain socket connection */
+PHP_FUNCTION(pfsockopen)
+{
+ _php3_fsockopen(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+/* }}} */
+
+/* Known issues with the socket buffering code:
+ * - does not work reliably with persistent sockets yet
+ * (buffered data is not persistent)
+ * - php3_fopen_url_wrapper() is still doing single-byte lookahead/read
+ */
+/* {{{ _php3_sock_fgets() */
+
+int _php3_sock_fgets(char *buf, int maxlen, int socket)
+{
+ struct php3i_sockbuf *sockbuf = NULL, *tmpsockbuf;
+ int bytesread, toread, len, buflen, count = 0;
+ char *nl;
+
+ tmpsockbuf = phpsockbuf;
+ while (tmpsockbuf) {
+ if (tmpsockbuf->socket == socket) {
+ sockbuf = tmpsockbuf;
+ break;
+ }
+ tmpsockbuf = tmpsockbuf->next;
+ }
+
+ if (sockbuf) {
+ toread = sockbuf->writepos - sockbuf->readpos;
+ if (toread > maxlen) {
+ toread = maxlen;
+ }
+ if ((nl = memchr(sockbuf->readbuf + sockbuf->readpos, '\n', toread)) != NULL) {
+ toread = (nl - (sockbuf->readbuf + sockbuf->readpos)) + 1;
+ }
+ memcpy(buf, sockbuf->readbuf + sockbuf->readpos, toread);
+ sockbuf->readpos += toread;
+ count += toread;
+ buf += toread;
+ if (sockbuf->readpos >= sockbuf->writepos) {
+ sockbuf->readpos = sockbuf->writepos = 0;
+ }
+ if (nl != NULL) {
+ /* if a newline was found, skip the recv() loop */
+ goto sock_fgets_exit;
+ }
+ }
+
+ nl = NULL;
+ buflen = 0;
+ while (count < maxlen && nl == NULL) {
+ toread = maxlen - count;
+ bytesread = recv(socket, buf, toread, 0);
+ if (bytesread <= 0) {
+ break;
+ }
+ if ((nl = memchr(buf, '\n', bytesread)) != NULL) {
+ len = (nl - buf) + 1;
+ count += len;
+ buf += len;
+ if (len < bytesread) {
+ buflen = bytesread - len;
+ break;
+ }
+ } else {
+ count += bytesread;
+ buf += bytesread;
+ }
+ }
+
+ if (buflen > 0) { /* there was data after the "\n" ... */
+ if (sockbuf == NULL) {
+ sockbuf = emalloc(sizeof(struct php3i_sockbuf));
+ sockbuf->socket = socket;
+ sockbuf->readbuf = emalloc(maxlen);
+ sockbuf->readbuflen = maxlen;
+ sockbuf->readpos = sockbuf->writepos = 0;
+ sockbuf->next = phpsockbuf;
+ phpsockbuf = sockbuf;
+ } else {
+ int needlen = sockbuf->writepos + buflen;
+ if (needlen > sockbuf->readbuflen) {
+ sockbuf->readbuflen += maxlen;
+ sockbuf->readbuf = erealloc(sockbuf->readbuf, sockbuf->readbuflen);
+ }
+ }
+ memcpy(sockbuf->readbuf + sockbuf->writepos, buf, buflen);
+ sockbuf->writepos += buflen;
+ }
+
+ sock_fgets_exit:
+ *buf = '\0';
+ return count;
+}
+
+/* }}} */
+/* {{{ _php3_sock_fread() */
+
+int _php3_sock_fread(char *buf, int maxlen, int socket)
+{
+ struct php3i_sockbuf *sockbuf = phpsockbuf;
+ int bytesread, toread, count = 0;
+
+ while (sockbuf) {
+ if (sockbuf->socket == socket) {
+ toread = sockbuf->writepos - sockbuf->readpos;
+ if (toread > maxlen) {
+ toread = maxlen;
+ }
+ memcpy(buf, sockbuf->readbuf + sockbuf->readpos, toread);
+ sockbuf->readpos += toread;
+ count += toread;
+ buf += toread;
+ break;
+ }
+ sockbuf = sockbuf->next;
+ }
+
+ while (count < maxlen) {
+ toread = maxlen - count;
+ bytesread = recv(socket, buf, toread, 0);
+ if (bytesread <= 0) {
+ break;
+ }
+ count += bytesread;
+ buf += bytesread;
+ }
+
+ *buf = '\0';
+ return count;
+}
+
+/* }}} */
+/* {{{ module start/shutdown functions */
+
+ /* {{{ _php3_sock_destroy */
+#ifndef THREAD_SAFE
+static void _php3_sock_destroy(void *data)
+{
+ int *sock = (int *) data;
+ close(*sock);
+}
+#endif
+/* }}} */
+ /* {{{ php3_minit_fsock */
+
+static int php3_minit_fsock(INIT_FUNC_ARGS)
+{
+#ifndef THREAD_SAFE
+ _php3_hash_init(&ht_keys, 0, NULL, NULL, 1);
+ _php3_hash_init(&ht_socks, 0, NULL, _php3_sock_destroy, 1);
+#endif
+ return SUCCESS;
+}
+/* }}} */
+ /* {{{ php3_mshutdown_fsock */
+
+static int php3_mshutdown_fsock(void)
+{
+#ifndef THREAD_SAFE
+ _php3_hash_destroy(&ht_socks);
+ _php3_hash_destroy(&ht_keys);
+#endif
+ return SUCCESS;
+}
+/* }}} */
+ /* {{{ php3_rshutdown_fsock() */
+
+static int php3_rshutdown_fsock(void)
+{
+ struct php3i_sockbuf *sockbuf = phpsockbuf, *this;
+
+ while (sockbuf) {
+ this = sockbuf;
+ sockbuf = this->next;
+ efree(this->readbuf);
+ efree(this);
+ }
+ phpsockbuf = NULL;
+ return SUCCESS;
+}
+
+/* }}} */
+
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/fsock.h b/ext/standard/fsock.h
new file mode 100644
index 0000000000..9be93a34a6
--- /dev/null
+++ b/ext/standard/fsock.h
@@ -0,0 +1,47 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-1999 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Paul Panotzki - Bunyip Information Systems |
+ | Jim Winstead (jimw@php.net) |
+ +----------------------------------------------------------------------+
+*/
+/* $Id$ */
+
+#ifndef _FSOCK_H
+#define _FSOCK_H
+
+#include <netinet/in.h>
+
+extern php3_module_entry fsock_module_entry;
+#define fsock_module_ptr &fsock_module_entry
+
+extern PHP_FUNCTION(fsockopen);
+extern PHP_FUNCTION(pfsockopen);
+extern int lookup_hostname(const char *addr, struct in_addr *in);
+extern int _php3_sock_fgets(char *buf, int maxlen, int socket);
+extern int _php3_sock_fread(char *buf, int maxlen, int socket);
+extern int _php3_is_persistent_sock(int);
+
+#endif /* _FSOCK_H */
diff --git a/ext/standard/global.h b/ext/standard/global.h
new file mode 100644
index 0000000000..cc528d4b6b
--- /dev/null
+++ b/ext/standard/global.h
@@ -0,0 +1,58 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ +----------------------------------------------------------------------+
+ */
+/* GLOBAL.H - RSAREF types and constants
+ */
+
+/* PROTOTYPES should be set to one if and only if the compiler supports
+ function argument prototyping.
+ The following makes PROTOTYPES default to 0 if it has not already
+ been defined with C compiler flags.
+ */
+#ifndef PROTOTYPES
+#define PROTOTYPES 1 /* php3 has prototypes everywhere */
+#endif
+
+/* _POINTER defines a generic pointer type */
+typedef unsigned char *_POINTER;
+
+/* UINT2 defines a two byte word */
+typedef unsigned short int UINT2;
+
+/* UINT4 defines a four byte word */
+typedef unsigned long int UINT4;
+
+/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
+ If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
+ returns an empty list.
+ */
+#if PROTOTYPES
+#define PROTO_LIST(list) list
+#else
+#define PROTO_LIST(list) ()
+#endif
diff --git a/ext/standard/html.c b/ext/standard/html.c
new file mode 100644
index 0000000000..f15131523d
--- /dev/null
+++ b/ext/standard/html.c
@@ -0,0 +1,134 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ | Jaakko Hyvätti <jaakko.hyvatti@iki.fi> |
+ +----------------------------------------------------------------------+
+ */
+
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "reg.h"
+#include "html.h"
+
+/* This must be fixed to handle the input string according to LC_CTYPE.
+ Defaults to ISO-8859-1 for now. */
+
+static char EntTable[][7] =
+{
+ "nbsp","iexcl","cent","pound","curren","yen","brvbar",
+ "sect","uml","copy","ordf","laquo","not","shy","reg",
+ "macr","deg","plusmn","sup2","sup3","acute","micro",
+ "para","middot","cedil","sup1","ordm","raquo","frac14",
+ "frac12","frac34","iquest","Agrave","Aacute","Acirc",
+ "Atilde","Auml","Aring","AElig","Ccedil","Egrave",
+ "Eacute","Ecirc","Euml","Igrave","Iacute","Icirc",
+ "Iuml","ETH","Ntilde","Ograve","Oacute","Ocirc","Otilde",
+ "Ouml","times","Oslash","Ugrave","Uacute","Ucirc","Uuml",
+ "Yacute","THORN","szlig","agrave","aacute","acirc",
+ "atilde","auml","aring","aelig","ccedil","egrave",
+ "eacute","ecirc","euml","igrave","iacute","icirc",
+ "iuml","eth","ntilde","ograve","oacute","ocirc","otilde",
+ "ouml","divide","oslash","ugrave","uacute","ucirc",
+ "uuml","yacute","thorn","yuml"
+};
+
+static void _php3_htmlentities(INTERNAL_FUNCTION_PARAMETERS, int all)
+{
+ pval *arg;
+ int i, len, maxlen;
+ unsigned char *old;
+ char *new;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(arg);
+
+ maxlen = 2 * arg->value.str.len;
+ if (maxlen < 128)
+ maxlen = 128;
+ new = emalloc (maxlen);
+ len = 0;
+
+ old = (unsigned char *)arg->value.str.val;
+ i = arg->value.str.len;
+ while (i--) {
+ if (len + 9 > maxlen)
+ new = erealloc (new, maxlen += 128);
+ if (38 == *old) {
+ memcpy (new + len, "&amp;", 5);
+ len += 5;
+ } else if (34 == *old) {
+ memcpy (new + len, "&quot;", 6);
+ len += 6;
+ } else if (60 == *old) {
+ memcpy (new + len, "&lt;", 4);
+ len += 4;
+ } else if (62 == *old) {
+ memcpy (new + len, "&gt;", 4);
+ len += 4;
+ } else if (all && 160 <= *old) {
+ new [len++] = '&';
+ strcpy (new + len, EntTable [*old - 160]);
+ len += strlen (EntTable [*old - 160]);
+ new [len++] = ';';
+ } else {
+ new [len++] = *old;
+ }
+ old++;
+ }
+ new [len] = '\0';
+
+ RETVAL_STRINGL(new,len,1);
+ efree(new);
+}
+
+/* {{{ proto string htmlspecialchars(string string)
+ Convert special characters to HTML entities */
+void php3_htmlspecialchars(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_htmlentities(INTERNAL_FUNCTION_PARAM_PASSTHRU,0);
+}
+/* }}} */
+
+/* {{{ proto string htmlentities(string string)
+ Convert all applicable characters to HTML entities */
+void php3_htmlentities(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_htmlentities(INTERNAL_FUNCTION_PARAM_PASSTHRU,1);
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/html.h b/ext/standard/html.h
new file mode 100644
index 0000000000..892dfb6bed
--- /dev/null
+++ b/ext/standard/html.h
@@ -0,0 +1,38 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#ifndef _HTML_H
+#define _HTML_H
+
+extern void php3_htmlspecialchars(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_htmlentities(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _HTML_H */
diff --git a/ext/standard/image.c b/ext/standard/image.c
new file mode 100644
index 0000000000..a91607f3e7
--- /dev/null
+++ b/ext/standard/image.c
@@ -0,0 +1,386 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+/*
+ * Based on Daniel Schmitt's imageinfo.c which carried the following
+ * Copyright notice.
+ */
+
+/*
+ * imageinfo.c
+ *
+ * Simple routines to extract image width/height data from GIF/JPEG files.
+ *
+ * Copyright (c) 1997 Daniel Schmitt, opal online publishing, Bonn, Germany.
+ *
+ * Includes code snippets from rdjpgcom.c,
+ * Copyright (c) 1994-1995 Thomas G. Lane
+ * from release 6a of the Independent JPEG Group's software.
+ *
+ * Legal status: see GNU General Public License version 2 or later.
+ *
+ */
+
+#include "php.h"
+#include <stdio.h>
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#include "fopen-wrappers.h"
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include "image.h"
+
+/* file type markers */
+const char php3_sig_gif[3] =
+{'G', 'I', 'F'};
+const char php3_sig_jpg[3] =
+{(char) 0xff, (char) 0xd8, (char) 0xff};
+const char php3_sig_png[8] =
+{(char) 0x89, (char) 0x50, (char) 0x4e,
+ (char) 0x47, (char) 0x0d, (char) 0x0a,
+ (char) 0x1a, (char) 0x0a};
+
+/* return info as a struct, to make expansion easier */
+
+struct gfxinfo {
+ unsigned int width;
+ unsigned int height;
+};
+
+/* routine to handle GIF files. If only everything were that easy... ;} */
+static struct gfxinfo *php3_handle_gif (FILE *fp)
+{
+ struct gfxinfo *result = NULL;
+ unsigned char a[2];
+
+ result = (struct gfxinfo *) emalloc(sizeof(struct gfxinfo));
+ fseek(fp, 6L, SEEK_SET);
+ fread(a,sizeof(a),1,fp);
+ result->width = (unsigned short)a[0] | (((unsigned short)a[1])<<8);
+ fread(a,sizeof(a),1,fp);
+ result->height = (unsigned short)a[0] | (((unsigned short)a[1])<<8);
+ return result;
+}
+
+static unsigned long php3_read4(FILE *fp)
+{
+ unsigned char a[ 4 ];
+
+ /* just return 0 if we hit the end-of-file */
+ if (fread(a,sizeof(a),1,fp) != 1) return 0;
+
+ return (((unsigned long) a[ 0 ]) << 24) + (((unsigned long) a[ 1 ]) << 16) + (((unsigned long) a[ 2 ]) << 8) + ((unsigned long) a[ 3 ]);
+
+}
+
+/* routine to handle PNG files. - even easier */
+static struct gfxinfo *php3_handle_png(FILE *fp)
+{
+ struct gfxinfo *result = NULL;
+ unsigned long in_width, in_height;
+
+ result = (struct gfxinfo *) emalloc(sizeof(struct gfxinfo));
+ fseek(fp, 16L, SEEK_SET);
+ in_width = php3_read4(fp);
+ in_height = php3_read4(fp);
+ result->width = (unsigned int) in_width;
+ result->height = (unsigned int) in_height;
+ return result;
+}
+
+/* routines to handle JPEG data */
+
+/* some defines for the different JPEG block types */
+#define M_SOF0 0xC0 /* Start Of Frame N */
+#define M_SOF1 0xC1 /* N indicates which compression process */
+#define M_SOF2 0xC2 /* Only SOF0-SOF2 are now in common use */
+#define M_SOF3 0xC3
+#define M_SOF5 0xC5 /* NB: codes C4 and CC are NOT SOF markers */
+#define M_SOF6 0xC6
+#define M_SOF7 0xC7
+#define M_SOF9 0xC9
+#define M_SOF10 0xCA
+#define M_SOF11 0xCB
+#define M_SOF13 0xCD
+#define M_SOF14 0xCE
+#define M_SOF15 0xCF
+#define M_SOI 0xD8
+#define M_EOI 0xD9 /* End Of Image (end of datastream) */
+#define M_SOS 0xDA /* Start Of Scan (begins compressed data) */
+#define M_APP0 0xe0
+#define M_APP1 0xe1
+#define M_APP2 0xe2
+#define M_APP3 0xe3
+#define M_APP4 0xe4
+#define M_APP5 0xe5
+#define M_APP6 0xe6
+#define M_APP7 0xe7
+#define M_APP8 0xe8
+#define M_APP9 0xe9
+#define M_APP10 0xea
+#define M_APP11 0xeb
+#define M_APP12 0xec
+#define M_APP13 0xed
+#define M_APP14 0xee
+#define M_APP15 0xef
+
+static unsigned short php3_read2(FILE *fp)
+{
+ unsigned char a[ 2 ];
+
+ /* just return 0 if we hit the end-of-file */
+ if (fread(a,sizeof(a),1,fp) != 1) return 0;
+
+ return (((unsigned short) a[ 0 ]) << 8) + ((unsigned short) a[ 1 ]);
+}
+
+static unsigned int php3_next_marker(FILE *fp)
+ /* get next marker byte from file */
+{
+ int c;
+
+ /* skip unimportant stuff */
+
+ c = getc(fp);
+
+ while (c != 0xff) {
+ if ((c = getc(fp)) == EOF)
+ return M_EOI; /* we hit EOF */
+ }
+
+ /* get marker byte, swallowing possible padding */
+ do {
+ if ((c = getc(fp)) == EOF)
+ return M_EOI; /* we hit EOF */
+ } while (c == 0xff);
+
+ return (unsigned int) c;
+}
+
+static void php3_skip_variable(FILE *fp)
+ /* skip over a variable-length block; assumes proper length marker */
+{
+ unsigned short length;
+
+ length = php3_read2(fp);
+ length -= 2; /* length includes itself */
+ fseek(fp, (long) length, SEEK_CUR); /* skip the header */
+}
+
+static void php3_read_APP(FILE *fp,unsigned int marker,pval *info)
+{
+ unsigned short length;
+ unsigned char *buffer;
+ unsigned char markername[ 16 ];
+
+ length = php3_read2(fp);
+ length -= 2; /* length includes itself */
+
+ buffer = emalloc(length);
+
+ if (fread(buffer,length,1,fp) != 1) {
+ return;
+ }
+
+ sprintf(markername,"APP%d",marker - M_APP0);
+
+ add_assoc_stringl(info,markername,buffer,length,1);
+
+ efree(buffer);
+}
+
+static struct gfxinfo *php3_handle_jpeg(FILE *fp,pval *info)
+ /* main loop to parse JPEG structure */
+{
+ struct gfxinfo *result = NULL;
+ unsigned int marker;
+ unsigned short in_width, in_height;
+
+ fseek(fp, 0L, SEEK_SET); /* position file pointer on SOF */
+
+ if (getc(fp) != 0xFF) /* JPEG header... */
+ return NULL;
+
+ if (getc(fp) != M_SOI) /* JPEG header... */
+ return NULL;
+
+ for (;;) {
+ marker = php3_next_marker(fp);
+ switch (marker) {
+ case M_SOF0:
+ case M_SOF1:
+ case M_SOF2:
+ case M_SOF3:
+ case M_SOF5:
+ case M_SOF6:
+ case M_SOF7:
+ case M_SOF9:
+ case M_SOF10:
+ case M_SOF11:
+ case M_SOF13:
+ case M_SOF14:
+ case M_SOF15:
+ if (result == NULL) {
+ /* handle SOFn block */
+ fseek(fp, 3L, SEEK_CUR); /* skip length and precision bytes */
+ in_height = php3_read2(fp);
+ in_width = php3_read2(fp);
+ /* fill a gfxinfo struct to return the data */
+ result = (struct gfxinfo *) emalloc(sizeof(struct gfxinfo));
+
+ result->width = (unsigned int) in_width;
+ result->height = (unsigned int) in_height;
+
+ if (! info) /* if we don't want an extanded info -> return */
+ return result;
+ } else {
+ php3_skip_variable(fp);
+ }
+ break;
+
+ case M_APP0:
+ case M_APP1:
+ case M_APP2:
+ case M_APP3:
+ case M_APP4:
+ case M_APP5:
+ case M_APP6:
+ case M_APP7:
+ case M_APP8:
+ case M_APP9:
+ case M_APP10:
+ case M_APP11:
+ case M_APP12:
+ case M_APP13:
+ case M_APP14:
+ case M_APP15:
+ if (info) {
+ php3_read_APP(fp,marker,info); /* read all the app markes... */
+ } else {
+ php3_skip_variable(fp);
+ }
+ break;
+
+ case M_SOS:
+ case M_EOI:
+ return result; /* we're about to hit image data, or are at EOF. stop processing. */
+ break;
+
+ default:
+ php3_skip_variable(fp); /* anything else isn't interesting */
+ break;
+ }
+ }
+
+ return NULL;
+}
+
+/* main function */
+void php3_getimagesize(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg1,*info = 0;
+ FILE *fp;
+ int itype = 0;
+ char filetype[3];
+ char pngtype[8];
+ char temp[64];
+ struct gfxinfo *result = NULL;
+
+ switch(ARG_COUNT(ht)){
+ case 1:
+ if (getParameters(ht, 1, &arg1) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg1);
+ break;
+
+ case 2:
+ if (getParameters(ht, 2, &arg1, &info) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ if (!ParameterPassedByReference(ht, 2)) {
+ php3_error(E_WARNING, "Array to be filled with values must be passed by reference.");
+ RETURN_FALSE;
+ }
+
+ pval_destructor(info _INLINE_TLS);
+ if (array_init(info) == FAILURE) {
+ return;
+ }
+
+ convert_to_string(arg1);
+ break;
+
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+
+ /* Check open_basedir */
+ if (_php3_check_open_basedir(arg1->value.str.val)) return;
+
+ if ((fp = fopen(arg1->value.str.val,"rb")) == 0) {
+ php3_error(E_WARNING, "Unable to open %s", arg1->value.str.val);
+ return;
+ }
+ fread(filetype,sizeof(filetype),1,fp);
+ if (!memcmp(filetype, php3_sig_gif, 3)) {
+ result = php3_handle_gif (fp);
+ itype = 1;
+ } else if (!memcmp(filetype, php3_sig_jpg, 3)) {
+ result = php3_handle_jpeg(fp,info);
+ itype = 2;
+ } else if (!memcmp(filetype, php3_sig_png, 3)) {
+ fseek(fp, 0L, SEEK_SET);
+ fread(pngtype, sizeof(pngtype), 1, fp);
+ if (!memcmp(pngtype, php3_sig_png, 8)) {
+ result = php3_handle_png(fp);
+ itype = 3;
+ } else {
+ php3_error(E_WARNING, "PNG file corrupted by ASCII conversion");
+ }
+ }
+ fclose(fp);
+ if (result) {
+ if (array_init(return_value) == FAILURE) {
+ php3_error(E_ERROR, "Unable to initialize array");
+ if (result) efree(result);
+ return;
+ }
+ add_index_long(return_value, 0, result->width);
+ add_index_long(return_value, 1, result->height);
+ add_index_long(return_value, 2, itype);
+ sprintf(temp, "width=\"%d\" height=\"%d\"", result->width, result->height); /* safe */
+ add_index_string(return_value, 3, temp, 1);
+
+ efree(result);
+ }
+}
diff --git a/ext/standard/image.h b/ext/standard/image.h
new file mode 100644
index 0000000000..f006ceba43
--- /dev/null
+++ b/ext/standard/image.h
@@ -0,0 +1,36 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+
+#ifndef _IMAGE_H
+#define _IMAGE_H
+
+extern void php3_getimagesize(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _IMAGE_H */
diff --git a/ext/standard/info.c b/ext/standard/info.c
new file mode 100644
index 0000000000..9d5ff9dfe0
--- /dev/null
+++ b/ext/standard/info.c
@@ -0,0 +1,438 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ | Zeev Suraski <zeev@zend.com> |
+ +----------------------------------------------------------------------+
+ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "php_ini.h"
+#include "php_globals.h"
+#include "head.h"
+#include "info.h"
+#ifndef MSVC5
+#include "build-defs.h"
+#endif
+#include "zend_globals.h" /* needs ELS */
+
+
+#define PHP3_CONF_STR(directive,value1,value2) \
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">"); \
+ PUTS(directive); \
+ PUTS("</td><td bgcolor=\"" CONTENTS_COLOR "\">&nbsp;"); \
+ if (value1) PUTS(value1); \
+ else PUTS("<i>none</i>"); \
+ PUTS("</td><td bgcolor=\"" CONTENTS_COLOR "\">&nbsp;"); \
+ if (value2) PUTS(value2); \
+ else PUTS("<i>none</i>"); \
+ PUTS("</td></tr>\n");
+
+#define PHP3_CONF_LONG(directive,value1,value2) \
+ php3_printf("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">%s</td><td bgcolor=\"" CONTENTS_COLOR "\">%ld</td><td bgcolor=\"" CONTENTS_COLOR "\">%ld</td></tr>\n",directive,value1,value2);
+
+extern char **environ;
+
+#define SECTION(name) PUTS("<hr><h2>" name "</h2>\n")
+
+#define ENTRY_NAME_COLOR "#999999"
+#define CONTENTS_COLOR "#DDDDDD"
+#define HEADER_COLOR "#00DDDD"
+
+static int _display_module_info(php3_module_entry *module)
+{
+ PUTS("<tr><th align=left bgcolor=\"" ENTRY_NAME_COLOR "\">");
+ PUTS(module->name);
+ PUTS("</th><td bgcolor=\"" CONTENTS_COLOR "\">");
+ if (module->info_func) {
+ module->info_func();
+ } else {
+ PUTS("No additional information.");
+ }
+ PUTS("</td></tr>\n");
+ return 0;
+}
+
+
+void _php3_info(void)
+{
+ char **env,*tmp1,*tmp2;
+ char *php3_uname;
+#if WIN32|WINNT
+ char php3_windows_uname[256];
+ DWORD dwBuild=0;
+ DWORD dwVersion = GetVersion();
+ DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
+ DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
+#endif
+ ELS_FETCH();
+ PLS_FETCH();
+
+
+#if WIN32|WINNT
+ // Get build numbers for Windows NT or Win95
+ if (dwVersion < 0x80000000){
+ dwBuild = (DWORD)(HIWORD(dwVersion));
+ snprintf(php3_windows_uname,255,"%s %d.%d build %d","Windows NT",dwWindowsMajorVersion,dwWindowsMinorVersion,dwBuild);
+ } else {
+ snprintf(php3_windows_uname,255,"%s %d.%d","Windows 95/98",dwWindowsMajorVersion,dwWindowsMinorVersion);
+ }
+ php3_uname = php3_windows_uname;
+#else
+ php3_uname=PHP_UNAME;
+#endif
+
+
+ PUTS("<img src=\"?=PHPE9568F34-D428-11d2-A769-00AA001ACF42\" border=\"0\" width=\"100\" height=\"56\" align=\"right\">\n");
+ php3_printf("<center><h1>PHP Version %s</h1></center>\n", PHP_VERSION);
+ PUTS("<p>by <a href=\"mailto:rasmus@lerdorf.on.ca\">Rasmus Lerdorf</a>,\n");
+ PUTS("<a href=\"mailto:andi@zend.com\">Andi Gutmans</a>,\n");
+ PUTS("<a href=\"mailto:zeev@zend.com\">Zeev Suraski</a>,\n");
+ PUTS("<a href=\"mailto:ssb@guardian.no\">Stig Bakken</a>,\n");
+ PUTS("<a href=\"mailto:shane@caraveo.com\">Shane Caraveo</a>,\n");
+ PUTS("<a href=\"mailto:jimw@php.net\">Jim Winstead</a>, and countless others.</P>\n");
+
+ PUTS("<P><a href=\"http://www.zend.com/\">Zend</a>:</a> ");
+ PUTS("<a href=\"mailto:andi@zend.com\">Andi Gutmans</a> and \n");
+ PUTS("<a href=\"mailto:zeev@zend.com\">Zeev Suraski</a></p>\n");
+
+ PUTS("<hr>");
+ php3_printf("<center>System: %s<br>Build Date: %s</center>\n", php3_uname, __DATE__);
+ PUTS("<center>\n");
+
+ SECTION("Extensions");
+ PUTS("<table border=5 width=\"600\">\n");
+ PUTS("<tr><th bgcolor=\"" HEADER_COLOR "\">Extensions</th><th bgcolor=\"" HEADER_COLOR "\">Additional Information</th></tr>\n");
+
+#ifndef MSVC5
+ PUTS("<tr><th align=left bgcolor=\"" ENTRY_NAME_COLOR "\">PHP core</th>\n");
+ PUTS("<td bgcolor=\"" CONTENTS_COLOR "\"><tt>CFLAGS=" PHP_CFLAGS "<br>\n");
+ PUTS("HSREGEX=" PHP_HSREGEX "</td></tr>\n");
+#endif
+
+ _php3_hash_apply(&GLOBAL(module_registry),(int (*)(void *))_display_module_info);
+ PUTS("</table>\n");
+
+ SECTION("Configuration");
+ PUTS("php3.ini file path is set to: ");
+ PUTS(CONFIGURATION_FILE_PATH);
+ PUTS("<br>\n");
+ PUTS("<table border=5 width=\"600\">\n");
+ PUTS("<tr><th bgcolor=\"" HEADER_COLOR "\">Directive</th><th bgcolor=\"" HEADER_COLOR "\">Master Value</th><th bgcolor=\"" HEADER_COLOR "\">Local Value</th></tr>\n");
+ PHP3_CONF_STR("arg_separator", INI_ORIG_STR("arg_separator"), PG(arg_separator));
+ PHP3_CONF_LONG("asp_tags", INI_ORIG_INT("asp_tags"), PG(asp_tags));
+ PHP3_CONF_STR("auto_prepend_file", INI_ORIG_STR("auto_prepend_file"), PG(auto_prepend_file));
+ PHP3_CONF_STR("auto_append_file", INI_ORIG_STR("auto_append_file"), PG(auto_append_file));
+ PHP3_CONF_STR("browscap", INI_ORIG_STR("browscap"), INI_STR("browscap"));
+ PHP3_CONF_LONG("define_syslog_variables", INI_ORIG_STR("define_syslog_variables"), INI_STR("define_syslog_variables"));
+ PHP3_CONF_LONG("display_errors", INI_ORIG_INT("display_errors"), PG(display_errors));
+ PHP3_CONF_STR("doc_root", INI_ORIG_STR("doc_root"), PG(doc_root));
+ PHP3_CONF_LONG("enable_dl", INI_ORIG_INT("enable_dl"), PG(enable_dl));
+ PHP3_CONF_STR("error_log", INI_ORIG_STR("error_log"), PG(error_log));
+ PHP3_CONF_STR("error_prepend_string", INI_ORIG_STR("error_prepend_string"), INI_STR("error_prepend_string"));
+ PHP3_CONF_STR("error_append_string", INI_ORIG_STR("error_append_string"), INI_STR("error_append_string"));
+ PHP3_CONF_LONG("error_reporting", INI_ORIG_INT("error_reporting"), EG(error_reporting));
+ PHP3_CONF_STR("extension_dir", INI_ORIG_STR("extension_dir"), PG(extension_dir));
+ PHP3_CONF_STR("gpc_order", INI_ORIG_STR("gpc_order"), PG(gpc_order));
+ PHP3_CONF_STR("include_path", INI_ORIG_STR("include_path"), PG(include_path));
+ PHP3_CONF_LONG("log_errors", INI_ORIG_INT("log_errors"), PG(log_errors));
+ PHP3_CONF_LONG("max_execution_time", INI_ORIG_INT("max_execution_time"), PG(max_execution_time));
+ PHP3_CONF_LONG("magic_quotes_gpc", INI_ORIG_INT("magic_quotes_gpc"), PG(magic_quotes_gpc));
+ PHP3_CONF_LONG("magic_quotes_runtime", INI_ORIG_INT("magic_quotes_runtime"), PG(magic_quotes_runtime));
+ PHP3_CONF_LONG("magic_quotes_sybase", INI_ORIG_INT("magic_quotes_sybase"), PG(magic_quotes_sybase));
+ PHP3_CONF_LONG("memory limit", INI_ORIG_INT("memory_limit"), PG(memory_limit));
+ PHP3_CONF_STR("open_basedir", INI_ORIG_STR("open_basedir"), PG(open_basedir));
+ PHP3_CONF_LONG("precision", INI_ORIG_INT("precision"), EG(precision));
+ PHP3_CONF_LONG("safe_mode", INI_ORIG_INT("safe_mode"), PG(safe_mode));
+ PHP3_CONF_STR("safe_mode_exec_dir", INI_ORIG_STR("safe_mode_exec_dir"), PG(safe_mode_exec_dir));
+ PHP3_CONF_STR("sendmail_from", INI_ORIG_STR("sendmail_from"), INI_STR("sendmail_from"));
+ PHP3_CONF_STR("sendmail_path", INI_ORIG_STR("sendmail_path"), INI_STR("sendmail_path"));
+ PHP3_CONF_LONG("short_open_tag", INI_ORIG_INT("short_open_tag"), PG(short_tags));
+ PHP3_CONF_STR("SMTP", INI_ORIG_STR("SMTP"), INI_STR("SMTP"));
+ PHP3_CONF_LONG("sql_safe_mode", INI_ORIG_INT("sql.safe_mode"), PG(sql_safe_mode));
+ PHP3_CONF_LONG("track_errors", INI_ORIG_INT("track_errors"), PG(track_errors));
+ PHP3_CONF_LONG("track_vars", INI_ORIG_INT("track_vars"), PG(track_vars));
+ PHP3_CONF_LONG("upload_max_filesize", INI_ORIG_INT("upload_max_filesize"), PG(upload_max_filesize));
+ PHP3_CONF_STR("upload_tmp_dir", INI_ORIG_STR("upload_tmp_dir"), PG(upload_tmp_dir));
+ PHP3_CONF_STR("user_dir", INI_ORIG_STR("user_dir"), PG(user_dir));
+ PHP3_CONF_LONG("y2k_compliance", INI_ORIG_INT("y2k_compliance"), PG(y2k_compliance));
+ /* apache only directives */
+ PHP3_CONF_LONG("engine", INI_ORIG_INT("engine"), INI_INT("engine")); /* apache only */
+ PHP3_CONF_LONG("xbithack", INI_ORIG_INT("xbithack"), INI_INT("xbithack")); /* apache only */
+ PHP3_CONF_LONG("last_modified", INI_ORIG_INT("last_modified"), INI_INT("last_modified")); /* apache only */
+ /* end of apache only directives */
+
+ /* And now for the highlight colours */
+ php3_printf("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">highlight_comment</td><td bgcolor=\"" CONTENTS_COLOR "\"><font color=%s>&nbsp;%s</font></td><td bgcolor=\"" CONTENTS_COLOR "\"><font color=%s>&nbsp;%s</font></td></tr>\n",INI_ORIG_STR("highlight.comment"), INI_ORIG_STR("highlight.comment"), INI_STR("highlight.comment"), INI_STR("highlight.comment"));
+ php3_printf("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">highlight_default</td><td bgcolor=\"" CONTENTS_COLOR "\"><font color=%s>&nbsp;%s</font></td><td bgcolor=\"" CONTENTS_COLOR "\"><font color=%s>&nbsp;%s</font></td></tr>\n",INI_ORIG_STR("highlight.default"), INI_ORIG_STR("highlight.default"), INI_STR("highlight.default"), INI_STR("highlight.default"));
+ php3_printf("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">highlight_html</td><td bgcolor=\"" CONTENTS_COLOR "\"><font color=%s>&nbsp;%s</font></td><td bgcolor=\"" CONTENTS_COLOR "\"><font color=%s>&nbsp;%s</font></td></tr>\n",INI_ORIG_STR("highlight.html"), INI_ORIG_STR("highlight.html"), INI_STR("highlight.html"), INI_STR("highlight.html"));
+ php3_printf("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">highlight_string</td><td bgcolor=\"" CONTENTS_COLOR "\"><font color=%s>&nbsp;%s</font></td><td bgcolor=\"" CONTENTS_COLOR "\"><font color=%s>&nbsp;%s</font></td></tr>\n",INI_ORIG_STR("highlight.string"), INI_ORIG_STR("highlight.string"), INI_STR("highlight.string"), INI_STR("highlight.string"));
+ php3_printf("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">highlight_bg</td><td bgcolor=\"" CONTENTS_COLOR "\"><font color=%s>&nbsp;%s</font></td><td bgcolor=\"" CONTENTS_COLOR "\"><font color=%s>&nbsp;%s</font></td></tr>\n",INI_ORIG_STR("highlight.bg"), INI_ORIG_STR("highlight.bg"), INI_STR("highlight.bg"), INI_STR("highlight.bg"));
+ php3_printf("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">highlight_keyword</td><td bgcolor=\"" CONTENTS_COLOR "\"><font color=%s>&nbsp;%s</font></td><td bgcolor=\"" CONTENTS_COLOR "\"><font color=%s>&nbsp;%s</font></td></tr>\n",INI_ORIG_STR("highlight.keyword"), INI_ORIG_STR("highlight.keyword"), INI_STR("highlight.keyword"), INI_STR("highlight.keyword"));
+ PUTS("</table>");
+
+#if USE_SAPI /* call a server module specific info function */
+ GLOBAL(sapi_rqst)->info(GLOBAL(sapi_rqst));
+#endif
+
+ SECTION("Environment");
+ PUTS("<table border=5 width=\"600\">\n");
+ PUTS("<tr><th bgcolor=\"" HEADER_COLOR "\">Variable</th><th bgcolor=\"" HEADER_COLOR "\">Value</th></tr>\n");
+ for (env=environ; env!=NULL && *env !=NULL; env++) {
+ tmp1 = estrdup(*env);
+ if (!(tmp2=strchr(tmp1,'='))) { /* malformed entry? */
+ efree(tmp1);
+ continue;
+ }
+ *tmp2 = 0;
+ tmp2++;
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">");
+ PUTS(tmp1);
+ PUTS("</td><td bgcolor=\"" CONTENTS_COLOR "\">");
+ if (tmp2 && *tmp2) {
+ PUTS(tmp2);
+ } else {
+ PUTS("&nbsp;");
+ }
+ PUTS("</td></tr>\n");
+ efree(tmp1);
+ }
+ PUTS("</table>\n");
+
+ {
+ pval **data, **tmp;
+ char *string_key;
+ ulong num_key;
+
+ SECTION("PHP Variables");
+
+ PUTS("<table border=5 width=\"600\">\n");
+ PUTS("<tr><th bgcolor=\"" HEADER_COLOR "\">Variable</th><th bgcolor=\"" HEADER_COLOR "\">Value</th></tr>\n");
+ if (_php3_hash_find(&EG(symbol_table), "PHP_SELF", sizeof("PHP_SELF"), (void **) &data) != FAILURE) {
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">");
+ PUTS("PHP_SELF");
+ PUTS("</td><td bgcolor=\"" CONTENTS_COLOR "\">");
+ PUTS((*data)->value.str.val);
+ PUTS("</td></tr>\n");
+ }
+ if (_php3_hash_find(&EG(symbol_table), "PHP_AUTH_TYPE", sizeof("PHP_AUTH_TYPE"), (void **) &data) != FAILURE) {
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">");
+ PUTS("PHP_AUTH_TYPE");
+ PUTS("</td><td bgcolor=\"" CONTENTS_COLOR "\">");
+ PUTS((*data)->value.str.val);
+ PUTS("</td></tr>\n");
+ }
+ if (_php3_hash_find(&EG(symbol_table), "PHP_AUTH_USER", sizeof("PHP_AUTH_USER"), (void **) &data) != FAILURE) {
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">");
+ PUTS("PHP_AUTH_USER");
+ PUTS("</td><td bgcolor=\"" CONTENTS_COLOR "\">");
+ PUTS((*data)->value.str.val);
+ PUTS("</td></tr>\n");
+ }
+ if (_php3_hash_find(&EG(symbol_table), "PHP_AUTH_PW", sizeof("PHP_AUTH_PW"), (void **) &data) != FAILURE) {
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">");
+ PUTS("PHP_AUTH_PW");
+ PUTS("</td><td bgcolor=\"" CONTENTS_COLOR "\">");
+ PUTS((*data)->value.str.val);
+ PUTS("</td></tr>\n");
+ }
+ if (_php3_hash_find(&EG(symbol_table), "HTTP_GET_VARS", sizeof("HTTP_GET_VARS"), (void **) &data) != FAILURE) {
+ _php3_hash_internal_pointer_reset((*data)->value.ht);
+ while (_php3_hash_get_current_data((*data)->value.ht, (void **) &tmp) == SUCCESS) {
+ convert_to_string(*tmp);
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">HTTP_GET_VARS[\"");
+ switch (_php3_hash_get_current_key((*data)->value.ht, &string_key, &num_key)) {
+ case HASH_KEY_IS_STRING:
+ PUTS(string_key);
+ break;
+ case HASH_KEY_IS_LONG:
+ php3_printf("%ld",num_key);
+ break;
+ }
+ PUTS("\"]</td><td bgcolor=\"" CONTENTS_COLOR "\">");
+ PUTS((*tmp)->value.str.val); /* This could be "Array" - too ugly to expand that for now */
+ PUTS("</td></tr>\n");
+ _php3_hash_move_forward((*data)->value.ht);
+ }
+ }
+ if (_php3_hash_find(&EG(symbol_table), "HTTP_POST_VARS", sizeof("HTTP_POST_VARS"), (void **) &data) != FAILURE) {
+ _php3_hash_internal_pointer_reset((*data)->value.ht);
+ while (_php3_hash_get_current_data((*data)->value.ht, (void **) &tmp) == SUCCESS) {
+ convert_to_string(*tmp);
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">HTTP_POST_VARS[\"");
+ switch (_php3_hash_get_current_key((*data)->value.ht, &string_key, &num_key)) {
+ case HASH_KEY_IS_STRING:
+ PUTS(string_key);
+ break;
+ case HASH_KEY_IS_LONG:
+ php3_printf("%ld",num_key);
+ break;
+ }
+ PUTS("\"]</td><td bgcolor=\"" CONTENTS_COLOR "\">");
+ PUTS((*tmp)->value.str.val);
+ PUTS("</td></tr>\n");
+ _php3_hash_move_forward((*data)->value.ht);
+ }
+ }
+ if (_php3_hash_find(&EG(symbol_table), "HTTP_COOKIE_VARS", sizeof("HTTP_COOKIE_VARS"), (void **) &data) != FAILURE) {
+ _php3_hash_internal_pointer_reset((*data)->value.ht);
+ while (_php3_hash_get_current_data((*data)->value.ht, (void **) &tmp) == SUCCESS) {
+ convert_to_string(*tmp);
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">HTTP_COOKIE_VARS[\"");
+ switch (_php3_hash_get_current_key((*data)->value.ht, &string_key, &num_key)) {
+ case HASH_KEY_IS_STRING:
+ PUTS(string_key);
+ break;
+ case HASH_KEY_IS_LONG:
+ php3_printf("%ld",num_key);
+ break;
+ }
+ PUTS("\"]</td><td bgcolor=\"" CONTENTS_COLOR "\">");
+ PUTS((*tmp)->value.str.val);
+ PUTS("</td></tr>\n");
+ _php3_hash_move_forward((*data)->value.ht);
+ }
+ }
+ PUTS("</table>\n");
+ }
+
+#if APACHE
+ {
+ register int i;
+ array_header *arr = table_elts(GLOBAL(php3_rqst)->subprocess_env);
+ table_entry *elts = (table_entry *)arr->elts;
+
+ SECTION("Apache Environment");
+ PUTS("<table border=5 width=\"600\">\n");
+ PUTS("<tr><th bgcolor=\"" HEADER_COLOR "\">Variable</th><th bgcolor=\"" HEADER_COLOR "\">Value</th></tr>\n");
+ for (i=0; i < arr->nelts; i++) {
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">");
+ PUTS(elts[i].key);
+ PUTS("</td><td bgcolor=\"" CONTENTS_COLOR "\">");
+ PUTS(elts[i].val);
+ PUTS("&nbsp;</td></tr>\n");
+ }
+ PUTS("</table>\n");
+ }
+#endif
+
+#if APACHE
+ {
+ array_header *env_arr;
+ table_entry *env;
+ int i;
+
+ SECTION("HTTP Headers Information");
+ PUTS("<table border=5 width=\"600\">\n");
+ PUTS(" <tr><th colspan=2 bgcolor=\"" HEADER_COLOR "\">HTTP Request Headers</th></tr>\n");
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">HTTP Request</td><td bgcolor=\"" CONTENTS_COLOR "\">");
+ PUTS(GLOBAL(php3_rqst)->the_request);
+ PUTS("&nbsp;</td></tr>\n");
+ env_arr = table_elts(GLOBAL(php3_rqst)->headers_in);
+ env = (table_entry *)env_arr->elts;
+ for (i = 0; i < env_arr->nelts; ++i) {
+ if (env[i].key) {
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">");
+ PUTS(env[i].key);
+ PUTS("</td><td bgcolor=\"" CONTENTS_COLOR "\">");
+ PUTS(env[i].val);
+ PUTS("&nbsp;</td></tr>\n");
+ }
+ }
+ PUTS(" <tr><th colspan=2 bgcolor=\"" HEADER_COLOR "\">HTTP Response Headers</th></tr>\n");
+ env_arr = table_elts(GLOBAL(php3_rqst)->headers_out);
+ env = (table_entry *)env_arr->elts;
+ for(i = 0; i < env_arr->nelts; ++i) {
+ if (env[i].key) {
+ PUTS("<tr><td bgcolor=\"" ENTRY_NAME_COLOR "\">");
+ PUTS(env[i].key);
+ PUTS("</td><td bgcolor=\"" CONTENTS_COLOR "\">");
+ PUTS(env[i].val);
+ PUTS("&nbsp;</td></tr>\n");
+ }
+ }
+ PUTS("</table>\n\n");
+ }
+#endif
+
+ PUTS("</center>");
+
+ PUTS("<hr>\n");
+ PUTS("<table width=\"100%%\"><tr>\n");
+ php3_printf("<td><h2>Zend</h2>This program makes use of the Zend scripting language engine:<br><pre>%s</pre></td>", get_zend_version());
+ PUTS("<td width=\"100\"><a href=\"http://www.zend.com/\"><img src=\"?=PHPE9568F35-D428-11d2-A769-00AA001ACF42\" border=\"0\" width=\"100\" height=\"89\"></a></td>\n");
+ PUTS("</tr></table>\n");
+
+ SECTION("PHP License");
+ PUTS("<PRE>This program is free software; you can redistribute it and/or modify\n");
+ PUTS("it under the terms of:\n");
+ PUTS("\n");
+ PUTS("A) the GNU General Public License as published by the Free Software\n");
+ PUTS(" Foundation; either version 2 of the License, or (at your option)\n");
+ PUTS(" any later version.\n");
+ PUTS("\n");
+ PUTS("B) the PHP License as published by the PHP Development Team and\n");
+ PUTS(" included in the distribution in the file: LICENSE\n");
+ PUTS("\n");
+ PUTS("This program is distributed in the hope that it will be useful,\n");
+ PUTS("but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+ PUTS("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n");
+ PUTS("GNU General Public License for more details.\n");
+ PUTS("\n");
+ PUTS("You should have received a copy of both licenses referred to here.\n");
+ PUTS("If you did not, or have any questions about PHP licensing, please\n");
+ PUTS("contact core@php.net.</PRE>\n");
+
+}
+
+/* {{{ proto void phpinfo(void)
+ Output a page of useful information about PHP and the current request */
+void php3_info(INTERNAL_FUNCTION_PARAMETERS)
+{
+ TLS_VARS;
+
+ _php3_info();
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto string phpversion(void)
+ Return the current PHP version */
+void php3_version(INTERNAL_FUNCTION_PARAMETERS)
+{
+ TLS_VARS;
+
+ RETURN_STRING(PHP_VERSION,1);
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/info.h b/ext/standard/info.h
new file mode 100644
index 0000000000..41e5483145
--- /dev/null
+++ b/ext/standard/info.h
@@ -0,0 +1,40 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ | Zeev Suraski <zeev@zend.com> |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+
+#ifndef _INFO_H
+#define _INFO_H
+
+extern void php3_version(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_info(INTERNAL_FUNCTION_PARAMETERS);
+
+extern void _php3_info(void);
+
+#endif /* _INFO_H */
diff --git a/ext/standard/iptc.c b/ext/standard/iptc.c
new file mode 100644
index 0000000000..c0711d66be
--- /dev/null
+++ b/ext/standard/iptc.c
@@ -0,0 +1,132 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Thies C. Arntzen (thies@digicol.de) |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+/*
+ * Functions to parse & compse IPTC data.
+ * PhotoShop >= 3.0 can read and write textual data to JPEG files.
+ * ... more to come .....
+ */
+
+/*
+ * TODO:
+ * - add IPTC translation table
+ * - implement a call to embed iptc into a JPEG file
+ */
+
+#include "php.h"
+#include "php3_iptc.h"
+
+void php3_iptcparse(INTERNAL_FUNCTION_PARAMETERS)
+{
+ unsigned int length, inx, len, inheader, tagsfound;
+ unsigned char *buffer;
+ unsigned char recnum, dataset;
+ unsigned char key[ 16 ];
+ pval values, *str, *element;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+
+
+ inx = 0;
+ length = str->value.str.len;
+ buffer = str->value.str.val;
+
+ inheader = 0; /* have we already found the IPTC-Header??? */
+ tagsfound = 0; /* number of tags already found */
+
+ while (inx < length) {
+ if (buffer[ inx++ ] != 0x1c) { /* skip all junk */
+ if (inheader) {
+ break; /* we ran against some data which does not conform to IPTC - stop parsing! */
+ } else {
+ continue;
+ }
+ } else {
+ inheader = 1;
+ }
+
+ if ((inx + 4) >= length)
+ break;
+
+ dataset = buffer[ inx++ ];
+ recnum = buffer[ inx++ ];
+
+ if (buffer[ inx ] & (unsigned char) 0x80) {
+ len = (((long) buffer[ inx + 2 ]) << 24) + (((long) buffer[ inx + 3 ]) << 16) +
+ (((long) buffer[ inx + 4 ]) << 8) + (((long) buffer[ inx + 5 ]));
+ inx += 6;
+ } else {
+ len = (((unsigned short) buffer[ inx ])<<8) | (unsigned short)buffer[ inx+1 ];
+ inx += 2;
+ }
+
+ sprintf(key,"%d#%03d",(unsigned int) dataset,(unsigned int) recnum);
+
+ if ((inx + len) > length)
+ break;
+
+ if (tagsfound == 0) { /* found the 1st tag - initialize the return array */
+ if (array_init(return_value) == FAILURE) {
+ php3_error(E_ERROR, "Unable to initialize array");
+ RETURN_FALSE;
+ }
+ }
+
+ if (_php3_hash_find(return_value->value.ht,key,strlen(key) + 1,(void **) &element) == FAILURE) {
+ if (array_init(&values) == FAILURE) {
+ php3_error(E_ERROR, "Unable to initialize array");
+ RETURN_FALSE;
+ }
+
+ _php3_hash_update(return_value->value.ht, key, strlen(key)+1, (void *) &values, sizeof(pval), (void **) &element);
+ }
+
+ add_next_index_stringl(element,buffer+inx,len,1);
+
+ inx += len;
+
+ tagsfound++;
+ }
+
+ if (! tagsfound) {
+ RETURN_FALSE;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/link.c b/ext/standard/link.c
new file mode 100644
index 0000000000..e148858a3c
--- /dev/null
+++ b/ext/standard/link.c
@@ -0,0 +1,214 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: |
+ | |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "php3_filestat.h"
+#include "php_globals.h"
+
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/stat.h>
+#include <string.h>
+#if HAVE_PWD_H
+#if MSVC5
+#include "win32/pwd.h"
+#else
+#include <pwd.h>
+#endif
+#endif
+#if HAVE_GRP_H
+#if MSVC5
+#include "win32/grp.h"
+#else
+#include <grp.h>
+#endif
+#endif
+#include <errno.h>
+#include <ctype.h>
+
+#include "safe_mode.h"
+#include "php3_link.h"
+
+/* {{{ proto string readlink(string filename)
+ Return the target of a symbolic link */
+void php3_readlink(INTERNAL_FUNCTION_PARAMETERS)
+{
+#if HAVE_SYMLINK
+ pval *filename;
+ char buff[256];
+ int ret;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &filename) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(filename);
+
+ ret = readlink(filename->value.str.val, buff, 255);
+ if (ret == -1) {
+ php3_error(E_WARNING, "readlink failed (%s)", strerror(errno));
+ RETURN_FALSE;
+ }
+ /* Append NULL to the end of the string */
+ buff[ret] = '\0';
+ RETURN_STRING(buff,1);
+#endif
+}
+/* }}} */
+
+/* {{{ proto int linkinfo(string filename)
+ Returns the st_dev field of the UNIX C stat structure describing the link */
+void php3_linkinfo(INTERNAL_FUNCTION_PARAMETERS)
+{
+#if HAVE_SYMLINK
+ pval *filename;
+ struct stat sb;
+ int ret;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &filename) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(filename);
+
+ ret = lstat(filename->value.str.val, &sb);
+ if (ret == -1) {
+ php3_error(E_WARNING, "LinkInfo failed (%s)", strerror(errno));
+ RETURN_LONG(-1L);
+ }
+ RETURN_LONG((long) sb.st_dev);
+#endif
+}
+/* }}} */
+
+/* {{{ proto int symlink(string target, string link)
+ Create a symbolic link */
+void php3_symlink(INTERNAL_FUNCTION_PARAMETERS)
+{
+#if HAVE_SYMLINK
+ pval *topath, *frompath;
+ int ret;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &topath, &frompath) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(topath);
+ convert_to_string(frompath);
+
+ if (PG(safe_mode) && !_php3_checkuid(topath->value.str.val, 2)) {
+ RETURN_FALSE;
+ }
+
+ ret = symlink(topath->value.str.val, frompath->value.str.val);
+ if (ret == -1) {
+ php3_error(E_WARNING, "SymLink failed (%s)", strerror(errno));
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+#endif
+}
+/* }}} */
+
+/* {{{ proto int link(string target, string link)
+ Create a hard link */
+void php3_link(INTERNAL_FUNCTION_PARAMETERS)
+{
+#if HAVE_LINK
+ pval *topath, *frompath;
+ int ret;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &topath, &frompath) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(topath);
+ convert_to_string(frompath);
+
+ if (PG(safe_mode) && !_php3_checkuid(topath->value.str.val, 2)) {
+ RETURN_FALSE;
+ }
+
+ ret = link(topath->value.str.val, frompath->value.str.val);
+ if (ret == -1) {
+ php3_error(E_WARNING, "Link failed (%s)", strerror(errno));
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+#endif
+}
+/* }}} */
+
+/* {{{ proto int unlink(string filename)
+ Delete a file */
+void php3_unlink(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *filename;
+ int ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &filename) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(filename);
+
+ if (PG(safe_mode) && !_php3_checkuid(filename->value.str.val, 2)) {
+ RETURN_FALSE;
+ }
+
+ ret = unlink(filename->value.str.val);
+ if (ret == -1) {
+ php3_error(E_WARNING, "Unlink failed (%s)", strerror(errno));
+ RETURN_FALSE;
+ }
+ /* Clear stat cache */
+ php3_clearstatcache(INTERNAL_FUNCTION_PARAM_PASSTHRU);
+ RETURN_TRUE;
+}
+/* }}} */
+
+function_entry link_functions[] = {
+ {"readlink", php3_readlink, NULL},
+ {"linkinfo", php3_linkinfo, NULL},
+ {"symlink", php3_symlink, NULL},
+ {"link", php3_link, NULL},
+ {"unlink", php3_unlink, NULL},
+ {NULL, NULL, NULL}
+};
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/mail.c b/ext/standard/mail.c
new file mode 100644
index 0000000000..685e8d9cf9
--- /dev/null
+++ b/ext/standard/mail.c
@@ -0,0 +1,188 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: |
+ | |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdio.h>
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#ifndef MSVC5
+#include "build-defs.h"
+#endif
+#include "php3_mail.h"
+#include "php_ini.h"
+
+#if APACHE
+# ifndef DEBUG
+# undef palloc
+# endif
+#endif
+
+#if HAVE_SENDMAIL
+#if MSVC5
+#include "win32/sendmail.h"
+#endif
+
+function_entry mail_functions[] = {
+ {"mail", php3_mail, NULL},
+ {NULL, NULL, NULL}
+};
+
+php3_module_entry mail_module_entry = {
+ "Sendmail", mail_functions, NULL, NULL, NULL, NULL, php3_info_mail, STANDARD_MODULE_PROPERTIES
+};
+
+
+#if COMPILE_DL
+DLEXPORT php3_module_entry *get_module(void) { return &odbc_module_entry; }
+#endif
+
+/* {{{ proto int mail(string to, string subject, string message [, string additional_headers])
+ Send an email message */
+void php3_mail(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *argv[4];
+ char *to=NULL, *message=NULL, *headers=NULL, *subject=NULL;
+ int argc;
+ TLS_VARS;
+
+ argc = ARG_COUNT(ht);
+ if (argc < 3 || argc > 4 || getParametersArray(ht, argc, argv) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ /* To: */
+ convert_to_string(argv[0]);
+ if (argv[0]->value.str.val) {
+ to = argv[0]->value.str.val;
+ } else {
+ php3_error(E_WARNING, "No to field in mail command");
+ RETURN_FALSE;
+ }
+
+ /* Subject: */
+ convert_to_string(argv[1]);
+ if (argv[1]->value.str.val) {
+ subject = argv[1]->value.str.val;
+ } else {
+ php3_error(E_WARNING, "No subject field in mail command");
+ RETURN_FALSE;
+ }
+
+ /* message body */
+ convert_to_string(argv[2]);
+ if (argv[2]->value.str.val) {
+ message = argv[2]->value.str.val;
+ } else {
+ /* this is not really an error, so it is allowed. */
+ php3_error(E_WARNING, "No message string in mail command");
+ message = NULL;
+ }
+
+ if (argc == 4) { /* other headers */
+ convert_to_string(argv[3]);
+ headers = argv[3]->value.str.val;
+ }
+
+ if (_php3_mail(to, subject, message, headers)){
+ RETURN_TRUE;
+ } else {
+ RETURN_FALSE;
+ }
+}
+/* }}} */
+
+int _php3_mail(char *to, char *subject, char *message, char *headers)
+{
+#if MSVC5
+ int tsm_err;
+#else
+ FILE *sendmail;
+ int ret;
+ char *sendmail_path = INI_STR("sendmail_path");
+#endif
+
+#if MSVC5
+ if (TSendMail(INI_STR("SMTP"), &tsm_err, headers, subject, to, message) != SUCCESS){
+ php3_error(E_WARNING, GetSMErrorText(tsm_err));
+ return 0;
+ }
+#else
+ if (!sendmail_path) {
+ return 0;
+ }
+ sendmail = popen(sendmail_path, "w");
+
+ if (sendmail) {
+ fprintf(sendmail, "To: %s\n", to);
+ fprintf(sendmail, "Subject: %s\n", subject);
+ if (headers != NULL) {
+ fprintf(sendmail, "%s\n", headers);
+ }
+ fprintf(sendmail, "\n%s\n", message);
+ ret = pclose(sendmail);
+ if (ret == -1) {
+ return 0;
+ } else {
+ return 1;
+ }
+ } else {
+ php3_error(E_WARNING, "Could not execute mail delivery program");
+ return 0;
+ }
+#endif
+ return 1;
+}
+
+void php3_info_mail(void)
+{
+#if MSVC5
+ PUTS("Internal Sendmail support for Windows 4");
+#else
+ php3_printf("Path to sendmail: <tt>%s</tt>", INI_STR("sendmail_path"));
+#endif
+}
+
+#else
+
+void php3_mail(INTERNAL_FUNCTION_PARAMETERS) {}
+void php3_info_mail() {}
+
+#endif
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * End:
+ */
diff --git a/ext/standard/math.c b/ext/standard/math.c
new file mode 100644
index 0000000000..e13fb82119
--- /dev/null
+++ b/ext/standard/math.c
@@ -0,0 +1,708 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Jim Winstead (jimw@php.net) |
+ | Stig Sæther Bakken <ssb@guardian.no> |
+ +----------------------------------------------------------------------+
+ */
+
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "phpmath.h"
+#include "snprintf.h"
+
+#include <math.h>
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+char *_php3_number_format(double, int, char ,char);
+
+/* {{{ proto int abs(int number)
+ Return the absolute value of the number */
+void php3_abs(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *value;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht)!=1||getParameters(ht,1,&value)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ if (value->type == IS_STRING) {
+ convert_scalar_to_number(value);
+ }
+
+ if (value->type == IS_DOUBLE) {
+ RETURN_DOUBLE(fabs(value->value.dval));
+ }
+ else if (value->type == IS_LONG) {
+ RETURN_LONG(labs(value->value.lval));
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto int ceil(double number)
+ Returns the next highest integer value of the number */
+void php3_ceil(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *value;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht)!=1||getParameters(ht,1,&value)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ if (value->type == IS_STRING) {
+ convert_scalar_to_number(value);
+ }
+
+ if (value->type == IS_DOUBLE) {
+ RETURN_LONG((long)ceil(value->value.dval));
+ }
+ else if (value->type == IS_LONG) {
+ RETURN_LONG(value->value.lval);
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto int floor(double number)
+ Returns the next lowest integer value from the number */
+void php3_floor(INTERNAL_FUNCTION_PARAMETERS) {
+ pval *value;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht)!=1||getParameters(ht,1,&value)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ if (value->type == IS_STRING) {
+ convert_scalar_to_number(value);
+ }
+
+ if (value->type == IS_DOUBLE) {
+ RETURN_LONG((long)floor(value->value.dval));
+ }
+ else if (value->type == IS_LONG) {
+ RETURN_LONG(value->value.lval);
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+#ifndef HAVE_RINT
+/* emulate rint */
+inline double rint(double n)
+{
+ double i, f;
+ f = modf(n, &i);
+ if (f > .5)
+ i++;
+ else if (f < -.5)
+ i--;
+ return i;
+}
+#endif
+
+/* {{{ proto int round(double number)
+ Returns the rounded value of the number */
+void php3_round(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *value;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &value) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ if (value->type == IS_STRING) {
+ convert_scalar_to_number(value);
+ }
+ if (value->type == IS_DOUBLE) {
+ RETURN_DOUBLE(rint(value->value.dval));
+ }
+ if (value->type == IS_LONG) {
+ RETURN_DOUBLE((double)value->value.lval);
+ }
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto double sin(double number)
+ Returns the sine of the number in radians */
+void php3_sin(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num);
+ return_value->value.dval = sin(num->value.dval);
+ return_value->type = IS_DOUBLE;
+}
+/* }}} */
+
+/* {{{ proto double cos(double number)
+ Returns the cosine of the number in radians */
+void php3_cos(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num);
+ return_value->value.dval = cos(num->value.dval);
+ return_value->type = IS_DOUBLE;
+}
+/* }}} */
+
+/* {{{ proto double tan(double number)
+ Returns the tangent of the number in radians */
+void php3_tan(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num);
+ return_value->value.dval = tan(num->value.dval);
+ return_value->type = IS_DOUBLE;
+}
+/* }}} */
+
+/* {{{ proto double asin(double number)
+ Returns the arc sine of the number in radians */
+void php3_asin(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num);
+ return_value->value.dval = asin(num->value.dval);
+ return_value->type = IS_DOUBLE;
+}
+/* }}} */
+
+/* {{{ proto double acos(double number)
+ Return the arc cosine of the number in radians */
+void php3_acos(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num);
+ return_value->value.dval = acos(num->value.dval);
+ return_value->type = IS_DOUBLE;
+}
+/* }}} */
+
+/* {{{ proto double atan(double number)
+ Returns the arc tangent of the number in radians */
+void php3_atan(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num);
+ return_value->value.dval = atan(num->value.dval);
+ return_value->type = IS_DOUBLE;
+}
+/* }}} */
+
+/* {{{ proto double atan2(double y, double x)
+ Returns the arc tangent of y/x, with the resulting quadrant determined by the signs of y and x */
+void php3_atan2(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num1, *num2;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &num1, &num2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num1);
+ convert_to_double(num2);
+ return_value->value.dval = atan2(num1->value.dval,num2->value.dval);
+ return_value->type = IS_DOUBLE;
+}
+/* }}} */
+
+/* {{{ proto double pi(void)
+ Returns an approximation of pi */
+void php3_pi(INTERNAL_FUNCTION_PARAMETERS)
+{
+ return_value->value.dval = M_PI;
+ return_value->type = IS_DOUBLE;
+}
+/* }}} */
+
+/* {{{ proto double pow(double base, double exponent)
+ Returns base raised to the power of expopent */
+void php3_pow(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num1, *num2;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht,2,&num1,&num2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num1);
+ convert_to_double(num2);
+ RETURN_DOUBLE(pow(num1->value.dval, num2->value.dval));
+}
+/* }}} */
+
+/* {{{ proto double exp(double number)
+ Returns e raised to the power of the number */
+void php3_exp(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num);
+ return_value->value.dval = exp(num->value.dval);
+ return_value->type = IS_DOUBLE;
+}
+/* }}} */
+
+/* {{{ proto double log(double number)
+ Returns the natural logarithm of the number */
+void php3_log(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num);
+ return_value->value.dval = log(num->value.dval);
+ return_value->type = IS_DOUBLE;
+}
+/* }}} */
+
+/* {{{ proto double log10(double number)
+ Returns the base-10 logarithm of the number */
+void php3_log10(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num);
+ return_value->value.dval = log10(num->value.dval);
+ return_value->type = IS_DOUBLE;
+}
+/* }}} */
+
+/* {{{ proto double sqrt(double number)
+ Returns the square root of the number */
+void php3_sqrt(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(num);
+ return_value->value.dval = sqrt(num->value.dval);
+ return_value->type = IS_DOUBLE;
+}
+/* }}} */
+
+/* {{{ proto double deg2rad(double number)
+ Converts the number in degrees to the radian equivalent */
+void php3_deg2rad(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *deg;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &deg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(deg);
+ RETVAL_DOUBLE((deg->value.dval / 180.0) * M_PI);
+}
+/* }}} */
+
+/* {{{ proto double rad2deg(double number)
+ Converts the radian number to the equivalent number in degrees */
+void php3_rad2deg(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *rad;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &rad) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_double(rad);
+ RETVAL_DOUBLE((rad->value.dval / M_PI) * 180);
+}
+/* }}} */
+
+
+/*
+ * Convert a string representation of a base(2-36) number to a long.
+ */
+static long
+_php3_basetolong(pval *arg, int base) {
+ long mult = 1, num = 0, digit;
+ int i;
+ char c, *s;
+
+ if (arg->type != IS_STRING || base < 2 || base > 36) {
+ return 0;
+ }
+
+ s = arg->value.str.val;
+
+ for (i = arg->value.str.len - 1; i >= 0; i--, mult *= base) {
+ c = toupper(s[i]);
+ if (c >= '0' && c <= '9') {
+ digit = (c - '0');
+ } else if (c >= 'A' && c <= 'Z') {
+ digit = (c - 'A' + 10);
+ } else {
+ continue;
+ }
+ if (digit >= base) {
+ continue;
+ }
+ num += mult * digit;
+ }
+
+ return num;
+}
+
+
+/*
+ * Convert a long to a string containing a base(2-36) representation of
+ * the number.
+ */
+static char *
+_php3_longtobase(pval *arg, int base)
+{
+ static char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
+ char *result, *ptr, *ret;
+ int len, digit;
+ long value;
+
+ if (arg->type != IS_LONG || base < 2 || base > 36) {
+ return empty_string;
+ }
+
+ value = arg->value.lval;
+
+ /* allocates space for the longest possible result with the lowest base */
+ len = (sizeof(arg->value.lval) * 8) + 1;
+ result = emalloc((sizeof(arg->value.lval) * 8) + 1);
+
+ ptr = result + len - 1;
+ *ptr-- = '\0';
+
+ do {
+ digit = value % base;
+ *ptr = digits[digit];
+ value /= base;
+ }
+ while (ptr-- > result && value);
+ ptr++;
+ ret = estrdup(ptr);
+ efree(result);
+
+ return ret;
+}
+
+/* {{{ proto int bindec(string binary_number)
+ Returns the decimal equivalent of the binary number */
+void php3_bindec(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ long ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(arg);
+ ret = _php3_basetolong(arg, 2);
+
+ RETVAL_LONG(ret);
+}
+/* }}} */
+
+/* {{{ proto int hexdec(string hexadimal_number)
+ Returns the decimal equivalent of the hexadecimal number */
+void php3_hexdec(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ long ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(arg);
+
+ ret = _php3_basetolong(arg, 16);
+ RETVAL_LONG(ret);
+}
+/* }}} */
+
+/* {{{ proto int octdec(string octal_number)
+ Returns the decimal equivalent of an octal string */
+void php3_octdec(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ long ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(arg);
+
+ ret = _php3_basetolong(arg, 8);
+ RETVAL_LONG(ret);
+}
+/* }}} */
+
+/* {{{ proto string decbin(int decimal_number)
+ Returns a string containing a binary representation of the number */
+void php3_decbin(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ char *result;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_long(arg);
+
+ result = _php3_longtobase(arg, 2);
+ return_value->type = IS_STRING;
+ return_value->value.str.len = strlen(result);
+ return_value->value.str.val = result;
+}
+/* }}} */
+
+/* {{{ proto string decoct(int decimal_number)
+ Returns a string containing an octal representation of the given number */
+void php3_decoct(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ char *result;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_long(arg);
+
+ result = _php3_longtobase(arg, 8);
+ return_value->type = IS_STRING;
+ return_value->value.str.len = strlen(result);
+ return_value->value.str.val = result;
+}
+/* }}} */
+
+/* {{{ proto string dechex(int decimal_number)
+ Returns a string containing a hexadecimal representation of the given number */
+void php3_dechex(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ char *result;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_long(arg);
+
+ result = _php3_longtobase(arg, 16);
+ return_value->type = IS_STRING;
+ return_value->value.str.len = strlen(result);
+ return_value->value.str.val = result;
+}
+/* }}} */
+
+
+/* {{{ proto string base_convert(string number, int frombase, int tobase)
+ Converts a number in a string from any base <= 36 to any base <= 36.
+*/
+void php3_base_convert(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *number, *frombase, *tobase, temp;
+ char *result;
+
+ if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &number, &frombase, &tobase)
+ == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(number);
+ convert_to_long(frombase);
+ convert_to_long(tobase);
+ if (frombase->value.lval < 2 || frombase->value.lval > 36) {
+ php3_error(E_WARNING, "base_convert: invalid `from base' (%d)",
+ frombase->value.lval);
+ RETURN_FALSE;
+ }
+ if (tobase->value.lval < 2 || tobase->value.lval > 36) {
+ php3_error(E_WARNING, "base_convert: invalid `to base' (%d)",
+ tobase->value.lval);
+ RETURN_FALSE;
+ }
+ temp.type = IS_LONG;
+ temp.value.lval = _php3_basetolong(number, frombase->value.lval);
+ result = _php3_longtobase(&temp, tobase->value.lval);
+ RETVAL_STRING(result, 0);
+} /* }}} */
+
+
+char *_php3_number_format(double d,int dec,char dec_point,char thousand_sep)
+{
+ char *tmpbuf,*resbuf;
+ char *s,*t; /* source, target */
+ int tmplen,reslen=0;
+ int count=0;
+ int is_negative=0;
+
+ if (d<0) {
+ is_negative=1;
+ d = -d;
+ }
+ dec = MAX(0,dec);
+ tmpbuf = (char *) emalloc(32+dec);
+
+ tmplen=_php3_sprintf(tmpbuf,"%.*f",dec,d);
+
+ for (t=tmpbuf; *t; t++) {
+ if (*t=='.') {
+ *t = dec_point;
+ }
+ }
+ if (dec) {
+ reslen = dec+1 + (tmplen-dec-1) + (tmplen-1-dec-1)/3;
+ } else {
+ reslen = tmplen+(tmplen-1)/3;
+ }
+ if (is_negative) {
+ reslen++;
+ }
+ resbuf = (char *) emalloc(reslen+1);
+
+ s = tmpbuf+tmplen-1;
+ t = resbuf+reslen;
+ *t-- = 0;
+
+ if (dec) {
+ while (*s!=dec_point) {
+ *t-- = *s--;
+ }
+ *t-- = *s--; /* copy that dot */
+ }
+
+ while(s>=tmpbuf) {
+ *t-- = *s--;
+ if ((++count%3)==0 && s>=tmpbuf) {
+ *t-- = thousand_sep;
+ }
+ }
+ if (is_negative) {
+ *t-- = '-';
+ }
+ efree(tmpbuf);
+ return resbuf;
+}
+
+/* {{{ proto string number_format(double number, [,int num_decimal_places [, string dec_seperator, string thousands_seperator)]])
+ Formats a number with grouped thousands */
+void php3_number_format(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num,*dec,*t_s,*d_p;
+ char thousand_sep=',', dec_point='.';
+
+ switch(ARG_COUNT(ht)) {
+ case 1:
+ if (getParameters(ht, 1, &num)==FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_double(num);
+ RETURN_STRING(_php3_number_format(num->value.dval,0,dec_point,thousand_sep),0);
+ break;
+ case 2:
+ if (getParameters(ht, 2, &num, &dec)==FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_double(num);
+ convert_to_long(dec);
+ RETURN_STRING(_php3_number_format(num->value.dval,dec->value.lval,dec_point,thousand_sep),0);
+ break;
+ case 4:
+ if (getParameters(ht, 4, &num, &dec, &d_p, &t_s)==FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_double(num);
+ convert_to_long(dec);
+ convert_to_string(d_p);
+ convert_to_string(t_s);
+ if (d_p->value.str.len==1) {
+ dec_point=d_p->value.str.val[0];
+ }
+ if (t_s->value.str.len==1) {
+ thousand_sep=t_s->value.str.val[0];
+ }
+ RETURN_STRING(_php3_number_format(num->value.dval,dec->value.lval,dec_point,thousand_sep),0);
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+}
+/* }}} */
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/md5.c b/ext/standard/md5.c
new file mode 100644
index 0000000000..23e2d54c4b
--- /dev/null
+++ b/ext/standard/md5.c
@@ -0,0 +1,407 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Lachlan Roche |
+ +----------------------------------------------------------------------+
+ */
+
+/*
+ * md5.c - Copyright 1997 Lachlan Roche
+ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+
+#include <stdio.h>
+#include "php.h"
+
+#include "md5.h"
+
+/* {{{ proto string md5(string str)
+ Calculate the md5 hash of a string */
+void php3_md5(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ char md5str[33];
+ PHP3_MD5_CTX context;
+ unsigned char digest[16];
+ int i;
+ char *r;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ md5str[0] = '\0';
+ PHP3_MD5Init(&context);
+ PHP3_MD5Update(&context, arg->value.str.val, arg->value.str.len);
+ PHP3_MD5Final(digest, &context);
+ for (i = 0, r = md5str; i < 16; i++, r += 2) {
+ sprintf(r, "%02x", digest[i]);
+ }
+ *r = '\0';
+ RETVAL_STRING(md5str,1);
+}
+/* }}} */
+
+/*
+ * The remaining code is the reference MD5 code (md5c.c) from rfc1321
+ */
+/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ rights reserved.
+
+ License to copy and use this software is granted provided that it
+ is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ Algorithm" in all material mentioning or referencing this software
+ or this function.
+
+ License is also granted to make and use derivative works provided
+ that such works are identified as "derived from the RSA Data
+ Security, Inc. MD5 Message-Digest Algorithm" in all material
+ mentioning or referencing the derived work.
+
+ RSA Data Security, Inc. makes no representations concerning either
+ the merchantability of this software or the suitability of this
+ software for any particular purpose. It is provided "as is"
+ without express or implied warranty of any kind.
+
+ These notices must be retained in any copies of any part of this
+ documentation and/or software.
+ */
+
+/* Constants for MD5Transform routine.
+ */
+
+
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+static void MD5Transform PROTO_LIST((UINT4[4], const unsigned char[64]));
+static void Encode PROTO_LIST
+ ((unsigned char *, UINT4 *, unsigned int));
+static void Decode PROTO_LIST
+ ((UINT4 *, const unsigned char *, unsigned int));
+static void MD5_memcpy PROTO_LIST((_POINTER, _POINTER, unsigned int));
+static void MD5_memset PROTO_LIST((_POINTER, int, unsigned int));
+
+static unsigned char PADDING[64] =
+{
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* F, G, H and I are basic MD5 functions.
+ */
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
+#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/* ROTATE_LEFT rotates x left n bits.
+ */
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+ Rotation is separate from addition to prevent recomputation.
+ */
+#define FF(a, b, c, d, x, s, ac) { \
+ (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define GG(a, b, c, d, x, s, ac) { \
+ (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define HH(a, b, c, d, x, s, ac) { \
+ (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define II(a, b, c, d, x, s, ac) { \
+ (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+
+/* MD5 initialization. Begins an MD5 operation, writing a new context.
+ */
+void PHP3_MD5Init(PHP3_MD5_CTX * context)
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xefcdab89;
+ context->state[2] = 0x98badcfe;
+ context->state[3] = 0x10325476;
+}
+
+/* MD5 block update operation. Continues an MD5 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+void PHP3_MD5Update(PHP3_MD5_CTX * context, const unsigned char *input,
+ unsigned int inputLen)
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 64 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((UINT4) inputLen << 3))
+ < ((UINT4) inputLen << 3))
+ context->count[1]++;
+ context->count[1] += ((UINT4) inputLen >> 29);
+
+ partLen = 64 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ MD5_memcpy
+ ((_POINTER) & context->buffer[index], (_POINTER) input, partLen);
+ MD5Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64)
+ MD5Transform(context->state, &input[i]);
+
+ index = 0;
+ } else
+ i = 0;
+
+ /* Buffer remaining input */
+ MD5_memcpy
+ ((_POINTER) & context->buffer[index], (_POINTER) & input[i],
+ inputLen - i);
+}
+
+/* MD5 finalization. Ends an MD5 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+void PHP3_MD5Final(unsigned char digest[16], PHP3_MD5_CTX * context)
+{
+ unsigned char bits[8];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ Encode(bits, context->count, 8);
+
+ /* Pad out to 56 mod 64.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 56) ? (56 - index) : (120 - index);
+ PHP3_MD5Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ PHP3_MD5Update(context, bits, 8);
+
+ /* Store state in digest */
+ Encode(digest, context->state, 16);
+
+ /* Zeroize sensitive information.
+ */
+ MD5_memset((_POINTER) context, 0, sizeof(*context));
+}
+
+/* MD5 basic transformation. Transforms state based on block.
+ */
+static void MD5Transform(state, block)
+UINT4 state[4];
+const unsigned char block[64];
+{
+ UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
+
+ Decode(x, block, 64);
+
+ /* Round 1 */
+ FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
+ FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
+ FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
+ FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
+ FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
+ FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
+ FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
+ FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
+ FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
+ FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
+ FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
+ FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
+ FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
+ FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
+ FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
+ FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
+
+ /* Round 2 */
+ GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
+ GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
+ GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
+ GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
+ GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
+ GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
+ GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
+ GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
+ GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
+ GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
+ GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
+ GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
+ GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
+ GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
+ GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
+ GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
+
+ /* Round 3 */
+ HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
+ HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
+ HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
+ HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
+ HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
+ HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
+ HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
+ HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
+ HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
+ HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
+ HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
+ HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
+ HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
+ HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
+ HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
+ HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
+
+ /* Round 4 */
+ II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
+ II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
+ II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
+ II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
+ II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
+ II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
+ II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
+ II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
+ II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
+ II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
+ II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
+ II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
+ II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
+ II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
+ II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
+ II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+
+ /* Zeroize sensitive information. */
+ MD5_memset((_POINTER) x, 0, sizeof(x));
+}
+
+/* Encodes input (UINT4) into output (unsigned char). Assumes len is
+ a multiple of 4.
+ */
+static void Encode(output, input, len)
+unsigned char *output;
+UINT4 *input;
+unsigned int len;
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4) {
+ output[j] = (unsigned char) (input[i] & 0xff);
+ output[j + 1] = (unsigned char) ((input[i] >> 8) & 0xff);
+ output[j + 2] = (unsigned char) ((input[i] >> 16) & 0xff);
+ output[j + 3] = (unsigned char) ((input[i] >> 24) & 0xff);
+ }
+}
+
+/* Decodes input (unsigned char) into output (UINT4). Assumes len is
+ a multiple of 4.
+ */
+static void Decode(output, input, len)
+UINT4 *output;
+const unsigned char *input;
+unsigned int len;
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4)
+ output[i] = ((UINT4) input[j]) | (((UINT4) input[j + 1]) << 8) |
+ (((UINT4) input[j + 2]) << 16) | (((UINT4) input[j + 3]) << 24);
+}
+
+/* Note: Replace "for loop" with standard memcpy if possible.
+ */
+
+static void MD5_memcpy(output, input, len)
+_POINTER output;
+_POINTER input;
+unsigned int len;
+{
+ unsigned int i;
+
+ for (i = 0; i < len; i++)
+ output[i] = input[i];
+}
+
+/* Note: Replace "for loop" with standard memset if possible.
+ */
+static void MD5_memset(output, value, len)
+_POINTER output;
+int value;
+unsigned int len;
+{
+ unsigned int i;
+
+ for (i = 0; i < len; i++)
+ ((char *) output)[i] = (char) value;
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/md5.h b/ext/standard/md5.h
new file mode 100644
index 0000000000..1c71321c2e
--- /dev/null
+++ b/ext/standard/md5.h
@@ -0,0 +1,71 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ +----------------------------------------------------------------------+
+ */
+#ifndef _md5_h
+#define _md5_h
+/* MD5.H - header file for MD5C.C
+ */
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+ rights reserved.
+
+ License to copy and use this software is granted provided that it
+ is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+ Algorithm" in all material mentioning or referencing this software
+ or this function.
+
+ License is also granted to make and use derivative works provided
+ that such works are identified as "derived from the RSA Data
+ Security, Inc. MD5 Message-Digest Algorithm" in all material
+ mentioning or referencing the derived work.
+
+ RSA Data Security, Inc. makes no representations concerning either
+ the merchantability of this software or the suitability of this
+ software for any particular purpose. It is provided "as is"
+ without express or implied warranty of any kind.
+
+ These notices must be retained in any copies of any part of this
+ documentation and/or software.
+ */
+
+#include "global.h"
+
+/* MD5 context. */
+typedef struct {
+ UINT4 state[4]; /* state (ABCD) */
+ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ unsigned char buffer[64]; /* input buffer */
+} PHP3_MD5_CTX;
+
+void PHP3_MD5Init PROTO_LIST((PHP3_MD5_CTX *));
+void PHP3_MD5Update PROTO_LIST((PHP3_MD5_CTX *, const unsigned char *, unsigned int));
+void PHP3_MD5Final PROTO_LIST((unsigned char[16], PHP3_MD5_CTX *));
+
+extern void php3_md5(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif
diff --git a/ext/standard/microtime.c b/ext/standard/microtime.c
new file mode 100644
index 0000000000..3ccf2a28a9
--- /dev/null
+++ b/ext/standard/microtime.c
@@ -0,0 +1,88 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Paul Panotzki - Bunyip Information Systems |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <errno.h>
+
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "microtime.h"
+#include "snprintf.h"
+
+#include <stdio.h>
+#if HAVE_GETTIMEOFDAY
+#if MSVC5
+#include "win32/time.h"
+#else
+#include <sys/time.h>
+#endif
+#endif
+
+#define NUL '\0'
+#define MICRO_IN_SEC 1000000.00
+
+/* {{{ proto string microtime(void)
+ Returns a string containing the current time in seconds and microseconds */
+#ifdef __cplusplus
+void php3_microtime(HashTable *)
+#else
+void php3_microtime(INTERNAL_FUNCTION_PARAMETERS)
+#endif
+{
+#if HAVE_GETTIMEOFDAY
+ struct timeval tp;
+ long sec = 0L;
+ double msec = 0.0;
+ char ret[100];
+ TLS_VARS;
+
+ if (gettimeofday((struct timeval *) &tp, (NUL)) == 0) {
+ msec = (double) (tp.tv_usec / MICRO_IN_SEC);
+ sec = tp.tv_sec;
+ }
+ snprintf(ret, 100, "%.8f %ld", msec, sec);
+ RETVAL_STRING(ret,1);
+#endif
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/microtime.h b/ext/standard/microtime.h
new file mode 100644
index 0000000000..b827272779
--- /dev/null
+++ b/ext/standard/microtime.h
@@ -0,0 +1,37 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Paul Panotzki - Bunyip Information Systems |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#ifndef _MICROTIME_H
+#define _MICROTIME_H
+
+extern void php3_microtime(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _MICROTIME_H */
diff --git a/ext/standard/pack.c b/ext/standard/pack.c
new file mode 100644
index 0000000000..629595df90
--- /dev/null
+++ b/ext/standard/pack.c
@@ -0,0 +1,890 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Chris Schneider <cschneid@relog.ch> |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#if MSVC5
+#include <windows.h>
+#include <winsock.h>
+#define O_RDONLY _O_RDONLY
+#include "win32/param.h"
+#else
+#include <sys/param.h>
+#endif
+#include "head.h"
+#include "safe_mode.h"
+#include "php3_string.h"
+#include "pack.h"
+#if HAVE_PWD_H
+#if MSVC5
+#include "win32/pwd.h"
+#else
+#include <pwd.h>
+#endif
+#endif
+#include "snprintf.h"
+#include "fsock.h"
+#if HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+
+function_entry pack_functions[] = {
+ {"pack", php3_pack, NULL},
+ {"unpack", php3_unpack, NULL},
+ {NULL, NULL, NULL}
+};
+
+php3_module_entry pack_module_entry = {
+ "PHP_pack", pack_functions, php3_minit_pack, NULL, NULL, NULL, NULL, STANDARD_MODULE_PROPERTIES
+};
+
+/* Whether machine is little endian */
+char machine_little_endian;
+
+/* Mapping of byte from char (8bit) to long for machine endian */
+static int byte_map[1];
+
+/* Mappings of bytes from int (machine dependant) to int for machine endian */
+static int int_map[sizeof(int)];
+
+/* Mappings of bytes from shorts (16bit) for all endian environments */
+static int machine_endian_short_map[2];
+static int big_endian_short_map[2];
+static int little_endian_short_map[2];
+
+/* Mappings of bytes from longs (32bit) for all endian environments */
+static int machine_endian_long_map[4];
+static int big_endian_long_map[4];
+static int little_endian_long_map[4];
+
+
+static void _php3_pack(pval *val, int size, int *map, char *output)
+{
+ int i;
+ char *v;
+
+ convert_to_long(val);
+ v = (char *)&val->value.lval;
+
+ for (i = 0; i < size; i++) {
+ *(output++) = v[map[i]];
+ }
+}
+
+
+/* pack() idea stolen from Perl (implemented formats behave the same as there)
+ * Implemented formats are A,a,h,H,c,C,s,S,i,I,l,L,n,N,f,d,x,X,@.
+ */
+/* {{{ proto string pack(string format, mixed arg1, mixed arg2, ...)
+ Takes 1 or more arguments and packs them into a binary string according to the format argument */
+PHP_FUNCTION(pack)
+{
+ pval **argv;
+ int argc, i;
+ int currentarg;
+ char *format;
+ int formatlen;
+ char *formatcodes;
+ int *formatargs;
+ int formatcount = 0;
+ int outputpos = 0, outputsize = 0;
+ char *output;
+ TLS_VARS;
+
+ argc = ARG_COUNT(ht);
+
+ if (argc < 1) {
+ WRONG_PARAM_COUNT;
+ }
+
+ argv = emalloc(argc * sizeof(pval *));
+
+ if (getParametersArray(ht, argc, argv) == FAILURE) {
+ efree(argv);
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(argv[0]);
+ format = argv[0]->value.str.val;
+ formatlen = argv[0]->value.str.len;
+
+ /* We have a maximum of <formatlen> format codes to deal with */
+ formatcodes = emalloc(formatlen * sizeof(*formatcodes));
+ formatargs = emalloc(formatlen * sizeof(*formatargs));
+ currentarg = 1;
+
+ /* Preprocess format into formatcodes and formatargs */
+ for (i = 0; i < formatlen; formatcount++) {
+ char code = format[i++];
+ int arg = 1;
+
+ /* Handle format arguments if any */
+ if (i < formatlen) {
+ char c = format[i];
+
+ if (c == '*') {
+ arg = -1;
+ i++;
+ }
+ else if ((c >= '0') && (c <= '9')) {
+ arg = atoi(&format[i]);
+
+ while (format[i] >= '0' && format[i] <= '9' && i < formatlen) {
+ i++;
+ }
+ }
+ }
+
+ /* Handle special arg '*' for all codes and check argv overflows */
+ switch ((int)code) {
+ /* Never uses any args */
+ case 'x': case 'X': case '@': {
+ if (arg < 0) {
+ php3_error(E_WARNING, "pack type %c: '*' ignored", code);
+ arg = 1;
+ }
+ break;
+ }
+
+ /* Always uses one arg */
+ case 'a': case 'A': case 'h': case 'H': {
+ if (currentarg >= argc) {
+ efree(argv);
+ efree(formatcodes);
+ efree(formatargs);
+ php3_error(E_ERROR, "pack type %c: not enough arguments", code);
+ RETURN_FALSE;
+ }
+
+ if (arg < 0) {
+ arg = argv[currentarg]->value.str.len;
+ }
+
+ currentarg++;
+ break;
+ }
+
+ /* Use as many args as specified */
+ case 'c': case 'C': case 's': case 'S': case 'i': case 'I':
+ case 'l': case 'L': case 'n': case 'N': case 'v': case 'V':
+ case 'f': case 'd': {
+ if (arg < 0) {
+ arg = argc - currentarg;
+ }
+
+ currentarg += arg;
+
+ if (currentarg > argc) {
+ efree(argv);
+ efree(formatcodes);
+ efree(formatargs);
+ php3_error(E_ERROR, "pack type %c: too few arguments", code);
+ RETURN_FALSE;
+ }
+ break;
+ }
+
+ default: {
+ php3_error(E_ERROR, "pack type %c: unknown format code", code);
+ RETURN_FALSE;
+ }
+ }
+
+ formatcodes[formatcount] = code;
+ formatargs[formatcount] = arg;
+ }
+
+ if (currentarg < argc) {
+ php3_error(E_WARNING, "pack %d arguments unused", (argc - currentarg));
+ }
+
+ /* Calculate output length and upper bound while processing*/
+ for (i = 0; i < formatcount; i++) {
+ int code = (int)formatcodes[i];
+ int arg = formatargs[i];
+
+ switch ((int)code) {
+ case 'h': case 'H': {
+ outputpos += (arg + 1) / 2; /* 4 bit per arg */
+ break;
+ }
+
+ case 'a': case 'A':
+ case 'c': case 'C':
+ case 'x': {
+ outputpos += arg; /* 8 bit per arg */
+ break;
+ }
+
+ case 's': case 'S': case 'n': case 'v': {
+ outputpos += arg * 2; /* 16 bit per arg */
+ break;
+ }
+
+ case 'i': case 'I': {
+ outputpos += arg * sizeof(int);
+ break;
+ }
+
+ case 'l': case 'L': case 'N': case 'V': {
+ outputpos += arg * 4; /* 32 bit per arg */
+ break;
+ }
+
+ case 'f': {
+ outputpos += arg * sizeof(float);
+ break;
+ }
+
+ case 'd': {
+ outputpos += arg * sizeof(double);
+ break;
+ }
+
+ case 'X': {
+ outputpos -= arg;
+
+ if (outputpos < 0) {
+ php3_error(E_WARNING, "pack type %c: outside of string", code);
+ outputpos = 0;
+ }
+ break;
+ }
+
+ case '@': {
+ outputpos = arg;
+ break;
+ }
+ }
+
+ if (outputsize < outputpos) {
+ outputsize = outputpos;
+ }
+ }
+
+ output = emalloc(outputsize + 1);
+ outputpos = 0;
+ currentarg = 1;
+
+ /* Do actual packing */
+ for (i = 0; i < formatcount; i++) {
+ int code = (int)formatcodes[i];
+ int arg = formatargs[i];
+ pval *val;
+
+ switch ((int)code) {
+ case 'a': case 'A': {
+ memset(&output[outputpos], (code == 'a') ? '\0' : ' ', arg);
+ val = argv[currentarg++];
+ convert_to_string(val);
+ memcpy(&output[outputpos], val->value.str.val,
+ (val->value.str.len < arg) ? val->value.str.len : arg);
+ outputpos += arg;
+ break;
+ }
+
+ case 'h': case 'H': {
+ int nibbleshift = (code == 'h') ? 0 : 4;
+ int first = 1;
+ char *v;
+
+ val = argv[currentarg++];
+ convert_to_string(val);
+ v = val->value.str.val;
+ outputpos--;
+
+ while (arg-- > 0) {
+ char n = *(v++);
+
+ if ((n >= '0') && (n <= '9')) {
+ n -= '0';
+ } else if ((n >= 'A') && (n <= 'F')) {
+ n -= ('A' - 10);
+ } else if ((n >= 'a') && (n <= 'f')) {
+ n -= ('a' - 10);
+ } else {
+ php3_error(E_WARNING, "pack type %c: illegal hex digit %c", code, n);
+ n = 0;
+ }
+
+ if (first--) {
+ output[++outputpos] = 0;
+ } else {
+ first = 1;
+ }
+
+ output[outputpos] |= (n << nibbleshift);
+ nibbleshift = (nibbleshift + 4) & 7;
+ }
+
+ outputpos++;
+ break;
+ }
+
+ case 'c': case 'C': {
+ while (arg-- > 0) {
+ _php3_pack(argv[currentarg++], 1, byte_map, &output[outputpos]);
+ outputpos++;
+ }
+ break;
+ }
+
+ case 's': case 'S': case 'n': case 'v': {
+ int *map = machine_endian_short_map;
+
+ if (code == 'n') {
+ map = big_endian_short_map;
+ } else if (code == 'v') {
+ map = little_endian_short_map;
+ }
+
+ while (arg-- > 0) {
+ _php3_pack(argv[currentarg++], 2, map, &output[outputpos]);
+ outputpos += 2;
+ }
+ break;
+ }
+
+ case 'i': case 'I': {
+ while (arg-- > 0) {
+ _php3_pack(argv[currentarg++], sizeof(int), int_map, &output[outputpos]);
+ outputpos += sizeof(int);
+ }
+ break;
+ }
+
+ case 'l': case 'L': case 'N': case 'V': {
+ int *map = machine_endian_long_map;
+
+ if (code == 'N') {
+ map = big_endian_long_map;
+ } else if (code == 'V') {
+ map = little_endian_long_map;
+ }
+
+ while (arg-- > 0) {
+ _php3_pack(argv[currentarg++], 4, map, &output[outputpos]);
+ outputpos += 4;
+ }
+ break;
+ }
+
+ case 'f': {
+ float v;
+
+ while (arg-- > 0) {
+ val = argv[currentarg++];
+ convert_to_double(val);
+ v = (float)val->value.dval;
+ memcpy(&output[outputpos], &v, sizeof(v));
+ outputpos += sizeof(v);
+ }
+ break;
+ }
+
+ case 'd': {
+ double v;
+
+ while (arg-- > 0) {
+ val = argv[currentarg++];
+ convert_to_double(val);
+ v = (double)val->value.dval;
+ memcpy(&output[outputpos], &v, sizeof(v));
+ outputpos += sizeof(v);
+ }
+ break;
+ }
+
+ case 'x': {
+ memset(&output[outputpos], '\0', arg);
+ outputpos += arg;
+ break;
+ }
+
+ case 'X': {
+ outputpos -= arg;
+
+ if (outputpos < 0) {
+ outputpos = 0;
+ }
+ break;
+ }
+
+ case '@': {
+ if (arg > outputpos) {
+ memset(&output[outputpos], '\0', arg - outputpos);
+ }
+ outputpos = arg;
+ break;
+ }
+ }
+ }
+
+ efree(argv);
+ efree(formatcodes);
+ efree(formatargs);
+ output[outputpos] = '\0';
+ RETVAL_STRINGL(output, outputpos, 1);
+ efree(output);
+}
+/* }}} */
+
+
+static long _php3_unpack(char *data, int size, int issigned, int *map)
+{
+ long result;
+ char *cresult = (char *)&result;
+ int i;
+
+ result = issigned ? -1 : 0;
+
+ for (i = 0; i < size; i++) {
+ cresult[map[i]] = *(data++);
+ }
+
+ return result;
+}
+
+
+/* unpack() is based on Perl's unpack(), but is modified a bit from there.
+ * Rather than depending on error-prone ordered lists or syntactically
+ * unpleasant pass-by-reference, we return an object with named paramters
+ * (like *_fetch_object()). Syntax is "f[repeat]name/...", where "f" is the
+ * formatter char (like pack()), "[repeatt]" is the optional repeater argument,
+ * and "name" is the name of the variable to use.
+ * Example: "c2chars/nints" will return an object with fields
+ * chars1, chars2, and ints.
+ * Numeric pack types will return numbers, a and A will return strings,
+ * f and d will return doubles.
+ * Implemented formats are A,a,h,H,c,C,s,S,i,I,l,L,n,N,f,d,x,X,@.
+ */
+/* {{{ proto array unpack(string format, string input)
+ Unpack binary string into named array elements according to format argument */
+PHP_FUNCTION(unpack)
+{
+ pval *formatarg;
+ pval *inputarg;
+ char *format;
+ char *input;
+ int formatlen;
+ int inputpos, inputlen;
+ int i;
+ TLS_VARS;
+
+ if ((ARG_COUNT(ht) != 2) || getParameters(ht, 2, &formatarg, &inputarg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(formatarg);
+ convert_to_string(inputarg);
+
+ format = formatarg->value.str.val;
+ formatlen = formatarg->value.str.len;
+ input = inputarg->value.str.val;
+ inputlen = inputarg->value.str.len;
+ inputpos = 0;
+
+ if (array_init(return_value) == FAILURE)
+ return;
+
+ while (formatlen-- > 0) {
+ char type = *(format++);
+ char c;
+ int arg = 1;
+ char *name;
+ int namelen;
+ int size=0;
+
+ /* Handle format arguments if any */
+ if (formatlen > 0) {
+ c = *format;
+
+ if ((c >= '0') && (c <= '9')) {
+ arg = atoi(format);
+
+ while ((formatlen > 0) && (*format >= '0') && (*format <= '9')) {
+ format++;
+ formatlen--;
+ }
+ } else if (c == '*') {
+ arg = -1;
+ format++;
+ formatlen--;
+ }
+ }
+
+ /* Get of new value in array */
+ name = format;
+
+ while ((formatlen > 0) && (*format != '/')) {
+ formatlen--;
+ format++;
+ }
+
+ namelen = format - name;
+
+ if (namelen > 200)
+ namelen = 200;
+
+ switch ((int)type) {
+ /* Never use any input */
+ case 'X': {
+ size = -1;
+ break;
+ }
+
+ case '@': {
+ size = 0;
+ break;
+ }
+
+ case 'a': case 'A': case 'h': case 'H': {
+ size = arg;
+ arg = 1;
+ break;
+ }
+
+ /* Use 1 byte of input */
+ case 'c': case 'C': case 'x': {
+ size = 1;
+ break;
+ }
+
+ /* Use 2 bytes of input */
+ case 's': case 'S': case 'n': case 'v': {
+ size = 2;
+ break;
+ }
+
+ /* Use sizeof(int) bytes of input */
+ case 'i': case 'I': {
+ size = sizeof(int);
+ break;
+ }
+
+ /* Use 4 bytes of input */
+ case 'l': case 'L': case 'N': case 'V': {
+ size = 4;
+ break;
+ }
+
+ /* Use sizeof(float) bytes of input */
+ case 'f': {
+ size = sizeof(float);
+ break;
+ }
+
+ /* Use sizeof(double) bytes of input */
+ case 'd': {
+ size = sizeof(double);
+ break;
+ }
+ }
+
+ /* Do actual unpacking */
+ for (i = 0; (i != arg); i++ ) {
+ /* Space for name + number, safe as namelen is ensured <= 200 */
+ char n[256];
+
+ if (arg != 1) {
+ /* Need to add element number to name */
+ sprintf(n, "%.*s%d", namelen, name, i + 1);
+ } else {
+ /* Truncate name to next format code or end of string */
+ sprintf(n, "%.*s", namelen, name);
+ }
+
+ if ((inputpos + size) <= inputlen) {
+ switch ((int)type) {
+ case 'a': case 'A': {
+ char pad = (type == 'a') ? '\0' : ' ';
+ int len = inputlen - inputpos; /* Remaining string */
+
+ /* If size was given take minimum of len and size */
+ if ((size >= 0) && (len > size)) {
+ len = size;
+ }
+
+ size = len;
+
+ /* Remove padding chars from unpacked data */
+ while (--len >= 0) {
+ if (input[inputpos + len] != pad)
+ break;
+ }
+
+ add_assoc_stringl(return_value, n, &input[inputpos], len + 1, 1);
+ break;
+ }
+
+ case 'h': case 'H': {
+ int len = (inputlen - inputpos) * 2; /* Remaining */
+ int nibbleshift = (type == 'h') ? 0 : 4;
+ int first = 1;
+ char *buf;
+ int ipos, opos;
+
+ /* If size was given take minimum of len and size */
+ if ((size >= 0) && (len > size)) {
+ len = size;
+ }
+
+ size = (len + 1) / 2;
+ buf = emalloc(len + 1);
+
+ for (ipos = opos = 0; opos < len; opos++) {
+ char c = (input[inputpos + ipos] >> nibbleshift) & 0xf;
+
+ if (c < 10) {
+ c += '0';
+ } else {
+ c += 'a' - 10;
+ }
+
+ buf[opos] = c;
+ nibbleshift = (nibbleshift + 4) & 7;
+
+ if (first-- == 0) {
+ ipos++;
+ first = 1;
+ }
+ }
+
+ buf[len] = '\0';
+ add_assoc_stringl(return_value, n, buf, len, 1);
+ efree(buf);
+ break;
+ }
+
+ case 'c': case 'C': {
+ int issigned = (type == 'c') ? (input[inputpos] & 0x80) : 0;
+ long v = _php3_unpack(&input[inputpos], 1, issigned, byte_map);
+ add_assoc_long(return_value, n, v);
+ break;
+ }
+
+ case 's': case 'S': case 'n': case 'v': {
+ long v;
+ int issigned = 0;
+ int *map = machine_endian_short_map;
+
+ if (type == 's') {
+ issigned = input[inputpos + (machine_little_endian ? 1 : 0)] & 0x80;
+ } else if (type == 'n') {
+ map = big_endian_short_map;
+ } else if (type == 'v') {
+ map = little_endian_short_map;
+ }
+
+ v = _php3_unpack(&input[inputpos], 2, issigned, map);
+ add_assoc_long(return_value, n, v);
+ break;
+ }
+
+ case 'i': case 'I': {
+ long v;
+ int issigned = 0;
+
+ if (type == 'i') {
+ issigned = input[inputpos + (machine_little_endian ? (sizeof(int) - 1) : 0)] & 0x80;
+ }
+
+ v = _php3_unpack(&input[inputpos], sizeof(int), issigned, int_map);
+ add_assoc_long(return_value, n, v);
+ break;
+ }
+
+ case 'l': case 'L': case 'N': case 'V': {
+ int issigned = 0;
+ int *map = machine_endian_long_map;
+ long v;
+
+ if (type == 'l') {
+ issigned = input[inputpos + (machine_little_endian ? 3 : 0)] & 0x80;
+ } else if (type == 'N') {
+ map = big_endian_long_map;
+ } else if (type == 'V') {
+ map = little_endian_long_map;
+ }
+
+ v = _php3_unpack(&input[inputpos], 4, issigned, map);
+ add_assoc_long(return_value, n, v);
+ break;
+ }
+
+ case 'f': {
+ float v;
+
+ memcpy(&v, &input[inputpos], sizeof(float));
+ add_assoc_double(return_value, n, (double)v);
+ break;
+ }
+
+ case 'd': {
+ double v;
+
+ memcpy(&v, &input[inputpos], sizeof(float));
+ add_assoc_double(return_value, n, v);
+ break;
+ }
+
+ case 'x': {
+ /* Do nothing with input, just skip it */
+ break;
+ }
+
+ case 'X': {
+ if (inputpos < size) {
+ inputpos = -size;
+ i = arg - 1; /* Break out of for loop */
+
+ if (arg >= 0) {
+ php3_error(E_WARNING, "pack type %c: outside of string", type);
+ }
+ }
+ break;
+ }
+
+ case '@': {
+ if (arg <= inputlen) {
+ inputpos = arg;
+ } else {
+ php3_error(E_WARNING, "pack type %c: outside of string", type);
+ }
+
+ i = arg - 1; /* Done, break out of for loop */
+ break;
+ }
+ }
+
+ inputpos += size;
+ } else if (arg < 0) {
+ /* Reached end of input for '*' repeater */
+ break;
+ } else {
+ php3_error(E_ERROR, "pack type %c: not enough input, need %d, have %d", type, size, inputlen - inputpos);
+ RETURN_FALSE;
+ }
+ }
+
+ formatlen--; /* Skip '/' separator, does no harm if inputlen == 0 */
+ format++;
+ }
+}
+/* }}} */
+
+
+int php3_minit_pack(INIT_FUNC_ARGS)
+{
+ int machine_endian_check = 1;
+ int i;
+ TLS_VARS;
+
+ machine_little_endian = ((char *)&machine_endian_check)[0];
+
+ if (machine_little_endian) {
+ /* Where to get lo to hi bytes from */
+ byte_map[0] = 0;
+
+ for (i = 0; i < sizeof(int); i++) {
+ int_map[i] = i;
+ }
+
+ machine_endian_short_map[0] = 0;
+ machine_endian_short_map[1] = 1;
+ big_endian_short_map[0] = 1;
+ big_endian_short_map[1] = 0;
+ little_endian_short_map[0] = 0;
+ little_endian_short_map[1] = 1;
+
+ machine_endian_long_map[0] = 0;
+ machine_endian_long_map[1] = 1;
+ machine_endian_long_map[2] = 2;
+ machine_endian_long_map[3] = 3;
+ big_endian_long_map[0] = 3;
+ big_endian_long_map[1] = 2;
+ big_endian_long_map[2] = 1;
+ big_endian_long_map[3] = 0;
+ little_endian_long_map[0] = 0;
+ little_endian_long_map[1] = 1;
+ little_endian_long_map[2] = 2;
+ little_endian_long_map[3] = 3;
+ }
+ else {
+ pval val;
+ int size = sizeof(val.value.lval);
+ val.value.lval=0; /*silence a warning*/
+
+ /* Where to get hi to lo bytes from */
+ byte_map[0] = size - 1;
+
+ for (i = 0; i < sizeof(int); i++) {
+ int_map[i] = size - (sizeof(int) - i);
+ }
+
+ machine_endian_short_map[0] = size - 2;
+ machine_endian_short_map[1] = size - 1;
+ big_endian_short_map[0] = size - 2;
+ big_endian_short_map[1] = size - 1;
+ little_endian_short_map[0] = size - 1;
+ little_endian_short_map[1] = size - 2;
+
+ machine_endian_long_map[0] = size - 4;
+ machine_endian_long_map[1] = size - 3;
+ machine_endian_long_map[2] = size - 2;
+ machine_endian_long_map[3] = size - 1;
+ big_endian_long_map[0] = size - 4;
+ big_endian_long_map[1] = size - 3;
+ big_endian_long_map[2] = size - 2;
+ big_endian_long_map[3] = size - 1;
+ little_endian_long_map[0] = size - 1;
+ little_endian_long_map[1] = size - 2;
+ little_endian_long_map[2] = size - 3;
+ little_endian_long_map[3] = size - 4;
+ }
+
+ return SUCCESS;
+}
+
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * End:
+ */
diff --git a/ext/standard/pack.h b/ext/standard/pack.h
new file mode 100644
index 0000000000..36a55091a3
--- /dev/null
+++ b/ext/standard/pack.h
@@ -0,0 +1,42 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#ifndef _PACK_H
+#define _PACK_H
+
+extern php3_module_entry pack_module_entry;
+#define pack_module_ptr &pack_module_entry
+
+extern int php3_minit_pack(INIT_FUNC_ARGS);
+extern void php3_pack(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_unpack(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _PACK_H */
diff --git a/ext/standard/pageinfo.c b/ext/standard/pageinfo.c
new file mode 100644
index 0000000000..2c072c7b35
--- /dev/null
+++ b/ext/standard/pageinfo.c
@@ -0,0 +1,159 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Jim Winstead <jimw@php.net> |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "pageinfo.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#if HAVE_PWD_H
+#if MSVC5
+#include "win32/pwd.h"
+#else
+#include <pwd.h>
+#endif
+#endif
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/stat.h>
+#if MSVC5
+#include <process.h>
+#endif
+
+#ifndef THREAD_SAFE
+static long page_uid = -1;
+static long page_inode = -1;
+static long page_mtime = -1;
+#endif
+
+static void _php3_statpage(void)
+{
+#if !APACHE
+ char *path;
+ struct stat sb;
+#endif
+ TLS_VARS;
+
+#if APACHE
+ /* Apache has already gone through the trouble of doing
+ the stat(), so the only real overhead is copying three
+ values. We can afford it, and it means we don't have to
+ worry about resetting the static variables after every
+ hit. */
+ GLOBAL(page_uid) = GLOBAL(php3_rqst)->finfo.st_uid;
+ GLOBAL(page_inode) = GLOBAL(php3_rqst)->finfo.st_ino;
+ GLOBAL(page_mtime) = GLOBAL(php3_rqst)->finfo.st_mtime;
+#else
+ if (GLOBAL(page_uid) == -1) {
+ path = GLOBAL(request_info).filename;
+ if (path != NULL) {
+ if (stat(path, &sb) == -1) {
+ php3_error(E_WARNING, "Unable to find file: '%s'", path);
+ return;
+ }
+ GLOBAL(page_uid) = sb.st_uid;
+ GLOBAL(page_inode) = sb.st_ino;
+ GLOBAL(page_mtime) = sb.st_mtime;
+ }
+ }
+#endif
+}
+
+long _php3_getuid(void)
+{
+ TLS_VARS;
+ _php3_statpage();
+ return (GLOBAL(page_uid));
+}
+
+/* {{{ proto int getmyuid(void)
+ Get PHP script owner's UID */
+void php3_getmyuid(INTERNAL_FUNCTION_PARAMETERS)
+{
+ long uid;
+ TLS_VARS;
+
+ uid = _php3_getuid();
+ if (uid < 0) {
+ RETURN_FALSE;
+ } else {
+ RETURN_LONG(uid);
+ }
+}
+/* }}} */
+
+/* {{{ proto int getmypid(void)
+ Get current process ID */
+void php3_getmypid(INTERNAL_FUNCTION_PARAMETERS)
+{
+ int pid;
+ TLS_VARS;
+
+ pid = getpid();
+ if (pid < 0) {
+ RETURN_FALSE;
+ } else {
+ RETURN_LONG((long) pid);
+ }
+}
+/* }}} */
+
+/* {{{ proto int getmyinode(void)
+ Get the inode of the current script being parsed */
+void php3_getmyinode(INTERNAL_FUNCTION_PARAMETERS)
+{
+ TLS_VARS;
+
+ _php3_statpage();
+ if (GLOBAL(page_inode) < 0) {
+ RETURN_FALSE;
+ } else {
+ RETURN_LONG(GLOBAL(page_inode));
+ }
+}
+/* }}} */
+
+/* {{{ proto int getlastmod(void)
+ Get time of last page modification */
+void php3_getlastmod(INTERNAL_FUNCTION_PARAMETERS)
+{
+ TLS_VARS;
+
+ _php3_statpage();
+ if (GLOBAL(page_mtime) < 0) {
+ RETURN_FALSE;
+ } else {
+ RETURN_LONG(GLOBAL(page_mtime));
+ }
+}
+/* }}} */
diff --git a/ext/standard/pageinfo.h b/ext/standard/pageinfo.h
new file mode 100644
index 0000000000..963fe1c1c7
--- /dev/null
+++ b/ext/standard/pageinfo.h
@@ -0,0 +1,11 @@
+#ifndef _PROCESS_H
+#define _PROCESS_H
+
+extern void php3_getmyuid(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_getmypid(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_getmyinode(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_getlastmod(INTERNAL_FUNCTION_PARAMETERS);
+
+extern long _php3_getuid(void);
+
+#endif
diff --git a/ext/standard/php3_browscap.h b/ext/standard/php3_browscap.h
new file mode 100644
index 0000000000..0b5e8cafd4
--- /dev/null
+++ b/ext/standard/php3_browscap.h
@@ -0,0 +1,43 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Zeev Suraski <zeev@zend.com> |
+ +----------------------------------------------------------------------+
+ */
+
+
+#ifndef _PHP3_BROWSCAP_H
+#define _PHP3_BROWSCAP_H
+
+extern php3_module_entry browscap_module_entry;
+#define browscap_module_ptr &browscap_module_entry
+
+extern int php3_minit_browscap(INIT_FUNC_ARGS);
+extern int php3_mshutdown_browscap(SHUTDOWN_FUNC_ARGS);
+
+extern void php3_get_browser(INTERNAL_FUNCTION_PARAMETERS);
+
+
+#endif /* _PHP3_BROWSCAP_H */
diff --git a/ext/standard/php3_dir.h b/ext/standard/php3_dir.h
new file mode 100644
index 0000000000..ee0e719dd7
--- /dev/null
+++ b/ext/standard/php3_dir.h
@@ -0,0 +1,48 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: |
+ | |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _PHP3_DIR_H
+#define _PHP3_DIR_H
+extern php3_module_entry php3_dir_module_entry;
+#define php3_dir_module_ptr &php3_dir_module_entry
+
+/* directory functions */
+extern int php3_minit_dir(INIT_FUNC_ARGS);
+extern void php3_opendir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_closedir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_chdir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_rewinddir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_readdir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_getdir(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _PHP3_DIR_H */
diff --git a/ext/standard/php3_filestat.h b/ext/standard/php3_filestat.h
new file mode 100644
index 0000000000..6c82124b36
--- /dev/null
+++ b/ext/standard/php3_filestat.h
@@ -0,0 +1,64 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Author: Jim Winstead <jimw@php.net> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#ifndef _FILESTAT_H
+#define _FILESTAT_H
+
+extern int php3_init_filestat(INIT_FUNC_ARGS);
+extern int php3_shutdown_filestat(SHUTDOWN_FUNC_ARGS);
+extern void php3_clearstatcache(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fileatime(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_filectime(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_filegroup(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fileinode(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_filemtime(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fileowner(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fileperms(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_filesize(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_filetype(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_iswritable(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_isreadable(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_isexec(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_isfile(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_isdir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_islink(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_fileexists(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_stat(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_lstat(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_chown(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_chgrp(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_chmod(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_touch(INTERNAL_FUNCTION_PARAMETERS);
+
+extern php3_module_entry php3_filestat_module_entry;
+#define php3_filestat_module_ptr &php3_filestat_module_entry
+
+#endif /* _FILESTAT_H */
diff --git a/ext/standard/php3_iptc.h b/ext/standard/php3_iptc.h
new file mode 100644
index 0000000000..4166fbd4ff
--- /dev/null
+++ b/ext/standard/php3_iptc.h
@@ -0,0 +1,38 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Thies C. Arntzen <thies@digicol.de> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _PHPIPTC_H
+#define _PHPIPTC_H
+
+extern void php3_iptcparse(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _PHPIPTC_H */
diff --git a/ext/standard/php3_link.h b/ext/standard/php3_link.h
new file mode 100644
index 0000000000..80718a893b
--- /dev/null
+++ b/ext/standard/php3_link.h
@@ -0,0 +1,41 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: |
+ | |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+#ifndef _PHP3_LINK_H
+#define _PHP3_LINK_H
+
+extern void php3_link(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_unlink(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_readlink(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_linkinfo(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_symlink(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _PHP3_LINK_H */
diff --git a/ext/standard/php3_mail.h b/ext/standard/php3_mail.h
new file mode 100644
index 0000000000..3fb763ecb0
--- /dev/null
+++ b/ext/standard/php3_mail.h
@@ -0,0 +1,46 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _MAIL_H
+#define _MAIL_H
+#if HAVE_SENDMAIL
+extern php3_module_entry mail_module_entry;
+#define mail_module_ptr &mail_module_entry
+
+extern void php3_mail(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_info_mail(void);
+extern int _php3_mail(char *to, char *subject, char *message, char *headers);
+
+#else
+#define mail_module_ptr NULL
+#endif
+#endif /* _MAIL_H */
diff --git a/ext/standard/php3_standard.h b/ext/standard/php3_standard.h
new file mode 100644
index 0000000000..828b3c4de6
--- /dev/null
+++ b/ext/standard/php3_standard.h
@@ -0,0 +1,71 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: |
+ | |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#include "basic_functions.h"
+#include "phpmath.h"
+#include "php3_string.h"
+#include "base64.h"
+#include "php3_dir.h"
+#include "dns.h"
+#include "reg.h"
+#include "php3_mail.h"
+#include "md5.h"
+#include "html.h"
+#include "exec.h"
+#include "file.h"
+#include "php3_syslog.h"
+#include "php3_filestat.h"
+#include "php3_browscap.h"
+#include "pack.h"
+#include "datetime.h"
+#include "microtime.h"
+#include "url.h"
+#include "pageinfo.h"
+#include "cyr_convert.h"
+#include "php3_link.h"
+#include "fsock.h"
+#include "image.h"
+#include "php3_iptc.h"
+#include "info.h"
+#include "uniqid.h"
+#include "php3_var.h"
+#include "quot_print.h"
+#include "type.h"
+
+#define standard_module_ptr basic_functions_module_ptr
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/php3_string.h b/ext/standard/php3_string.h
new file mode 100644
index 0000000000..eea721f5dd
--- /dev/null
+++ b/ext/standard/php3_string.h
@@ -0,0 +1,99 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ | Stig Sæther Bakken <ssb@guardian.no> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _PHPSTRING_H
+#define _PHPSTRING_H
+
+#ifndef THREAD_SAFE
+extern char *strtok_string;
+#endif
+
+extern void php3_strlen(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strcmp(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strspn(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strcspn(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strcasecmp(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_str_replace(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_chop(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_trim(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_ltrim(INTERNAL_FUNCTION_PARAMETERS);
+extern void soundex(INTERNAL_FUNCTION_PARAMETERS);
+
+extern void php3_explode(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_implode(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strtok(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strtoupper(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strtolower(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_basename(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_dirname(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strstr(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strpos(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strrpos(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strrchr(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_substr(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_quotemeta(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_ucfirst(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_ucwords(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strtr(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_strrev(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_hebrev(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_hebrev_with_conversion(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_user_sprintf(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_user_printf(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_addslashes(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_stripslashes(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_chr(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_ord(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_newline_to_br(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_setlocale(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_stristr(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_chunk_split(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_parsestr(INTERNAL_FUNCTION_PARAMETERS);
+
+#if HAVE_CRYPT
+extern php3_module_entry crypt_module_entry;
+#define crypt_module_ptr &crypt_module_entry
+extern void php3_crypt(INTERNAL_FUNCTION_PARAMETERS);
+#else
+#define crypt_module_ptr NULL
+#endif
+
+extern PHPAPI char *_php3_strtoupper(char *s);
+extern PHPAPI char *_php3_strtolower(char *s);
+extern char *_StrTr(char *string, char *str_from, char *str_to);
+extern PHPAPI char *_php3_addslashes(char *string, int length, int *new_length, int freeit);
+extern PHPAPI void _php3_stripslashes(char *string, int *len);
+extern PHPAPI void _php3_dirname(char *str, int len);
+extern PHPAPI char *php3i_stristr(unsigned char *s, unsigned char *t);
+
+#endif /* _PHPSTRING_H */
diff --git a/ext/standard/php3_syslog.h b/ext/standard/php3_syslog.h
new file mode 100644
index 0000000000..028a5aa018
--- /dev/null
+++ b/ext/standard/php3_syslog.h
@@ -0,0 +1,44 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: |
+ | |
+ +----------------------------------------------------------------------+
+ */
+#if HAVE_SYSLOG_H
+extern php3_module_entry syslog_module_entry;
+#define syslog_module_ptr &syslog_module_entry
+
+extern int php3_minit_syslog(INIT_FUNC_ARGS);
+extern int php3_rinit_syslog(INIT_FUNC_ARGS);
+extern int php3_rshutdown_syslog(SHUTDOWN_FUNC_ARGS);
+extern void php3_openlog(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_syslog(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_closelog(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_define_syslog_variables(INTERNAL_FUNCTION_PARAMETERS);
+
+#else
+#define syslog_module_ptr NULL
+#endif
diff --git a/ext/standard/php3_var.h b/ext/standard/php3_var.h
new file mode 100644
index 0000000000..238a0a3cb3
--- /dev/null
+++ b/ext/standard/php3_var.h
@@ -0,0 +1,42 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Jani Lehtimäki <jkl@njet.net> |
+ +----------------------------------------------------------------------+
+ */
+
+
+#ifndef _PHPVAR_H
+#define _PHPVAR_H
+
+PHP_FUNCTION(var_dump);
+PHP_FUNCTION(serialize);
+PHP_FUNCTION(unserialize);
+
+void php3api_var_dump(pval *struc, int level);
+void php3api_var_serialize(pval *buf, pval *struc);
+int php3api_var_unserialize(pval *rval, char **p, char *max);
+
+#endif /* _PHPVAR_H */
diff --git a/ext/standard/phpdir.h b/ext/standard/phpdir.h
new file mode 100644
index 0000000000..5813f79c36
--- /dev/null
+++ b/ext/standard/phpdir.h
@@ -0,0 +1,44 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _PHPDIR_H
+#define _PHPDIR_H
+
+/* directory functions */
+extern void php3_opendir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_closedir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_chdir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_rewinddir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_readdir(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_getdir(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _PHPDIR_H */
diff --git a/ext/standard/phpmath.h b/ext/standard/phpmath.h
new file mode 100644
index 0000000000..ed3759018b
--- /dev/null
+++ b/ext/standard/phpmath.h
@@ -0,0 +1,70 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Jim Winstead (jimw@php.net) |
+ | Stig Sæther Bakken <ssb@guardian.no> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _PHPMATH_H
+#define _PHPMATH_H
+extern void php3_sin(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_cos(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_tan(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_asin(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_acos(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_atan(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_atan2(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_pi(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_exp(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_log(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_log10(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_pow(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_sqrt(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_srand(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_rand(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_getrandmax(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_mt_srand(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_mt_rand(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_mt_getrandmax(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_abs(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_ceil(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_floor(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_round(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_decbin(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_dechex(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_decoct(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_bindec(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_hexdec(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_octdec(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_base_convert(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_number_format(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_deg2rad(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_rad2deg(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _PHPMATH_H */
diff --git a/ext/standard/quot_print.c b/ext/standard/quot_print.c
new file mode 100644
index 0000000000..55937d3b86
--- /dev/null
+++ b/ext/standard/quot_print.c
@@ -0,0 +1,109 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Kirill Maximov (kir@rus.net |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <string.h>
+#include <errno.h>
+
+#include "php.h"
+#include "quot_print.h"
+
+#include <stdio.h>
+
+/*
+* Converting HEX char to INT value
+*/
+static char _php3_hex2int(int c)
+{
+ if ( isdigit(c) )
+ {
+ return c - '0';
+ }
+ else if ( c >= 'A' && c <= 'F' )
+ {
+ return c - 'A' + 10;
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+/*
+*
+* Decoding Quoted-printable string.
+*
+*/
+/* {{{ proto string quoted_printable_decode(string str)
+ Convert a quoted-printable string to an 8 bit string */
+void php3_quoted_printable_decode(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg1;
+ char *str;
+ int i = 0, j = 0;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht,1,&arg1)==FAILURE)
+ {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg1);
+
+ str = arg1->value.str.val;
+ while ( str[i] )
+ {
+ if ( (str[i] == '=') && str[i+1] && str[i+2] &&
+ ( isdigit((int)str[i+1]) || (str[i+1]<='F' && str[i+1]>='A'))
+ &&
+ ( isdigit((int)str[i+2]) || (str[i+2]<='F' && str[i+2]>='A'))
+ )
+ {
+ str[j++] = (_php3_hex2int((int)str[i+1]) << 4 )
+ + _php3_hex2int((int)str[i+2]);
+ i += 3;
+ }
+ else if ( str[i] == 13 )
+ {
+ i++;
+ }
+ else
+ {
+ str[j++] = str[i++];
+ }
+ }
+ str[j] = '\0';
+
+ RETVAL_STRINGL(str, j, 1)
+}
+/* }}} */
diff --git a/ext/standard/quot_print.h b/ext/standard/quot_print.h
new file mode 100644
index 0000000000..abd959545f
--- /dev/null
+++ b/ext/standard/quot_print.h
@@ -0,0 +1,37 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Kirill Maximov (kir@rus.net) |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#ifndef _QUOT_PRINT_H
+#define _QUOT_PRINT_H
+
+extern void php3_quoted_printable_decode(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _QUOT_PRINT_H */
diff --git a/ext/standard/rand.c b/ext/standard/rand.c
new file mode 100644
index 0000000000..e117833296
--- /dev/null
+++ b/ext/standard/rand.c
@@ -0,0 +1,343 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ | Zeev Suraski <zeev@zend.com |
+ | Pedro Melo <melo@ip.pt> |
+ | |
+ | Based on code from: Shawn Cokus <Cokus@math.washington.edu> |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+
+#include <stdlib.h>
+
+#include "php.h"
+#include "phpmath.h"
+
+#ifndef RAND_MAX
+#define RAND_MAX (1<<15)
+
+#endif
+
+/*
+ This is the ``Mersenne Twister'' random number generator MT19937, which
+ generates pseudorandom integers uniformly distributed in 0..(2^32 - 1)
+ starting from any odd seed in 0..(2^32 - 1). This version is a recode
+ by Shawn Cokus (Cokus@math.washington.edu) on March 8, 1998 of a version by
+ Takuji Nishimura (who had suggestions from Topher Cooper and Marc Rieffel in
+ July-August 1997).
+
+ Effectiveness of the recoding (on Goedel2.math.washington.edu, a DEC Alpha
+ running OSF/1) using GCC -O3 as a compiler: before recoding: 51.6 sec. to
+ generate 300 million random numbers; after recoding: 24.0 sec. for the same
+ (i.e., 46.5% of original time), so speed is now about 12.5 million random
+ number generations per second on this machine.
+
+ According to the URL <http://www.math.keio.ac.jp/~matumoto/emt.html>
+ (and paraphrasing a bit in places), the Mersenne Twister is ``designed
+ with consideration of the flaws of various existing generators,'' has
+ a period of 2^19937 - 1, gives a sequence that is 623-dimensionally
+ equidistributed, and ``has passed many stringent tests, including the
+ die-hard test of G. Marsaglia and the load test of P. Hellekalek and
+ S. Wegenkittl.'' It is efficient in memory usage (typically using 2506
+ to 5012 bytes of static data, depending on data type sizes, and the code
+ is quite short as well). It generates random numbers in batches of 624
+ at a time, so the caching and pipelining of modern systems is exploited.
+ It is also divide- and mod-free.
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation (either version 2 of the License or, at your
+ option, any later version). This library is distributed in the hope that
+ it will be useful, but WITHOUT ANY WARRANTY, without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
+ the GNU Library General Public License for more details. You should have
+ received a copy of the GNU Library General Public License along with this
+ library; if not, write to the Free Software Foundation, Inc., 59 Temple
+ Place, Suite 330, Boston, MA 02111-1307, USA.
+
+ The code as Shawn received it included the following notice:
+
+ Copyright (C) 1997 Makoto Matsumoto and Takuji Nishimura. When
+ you use this, send an e-mail to <matumoto@math.keio.ac.jp> with
+ an appropriate reference to your work.
+
+ It would be nice to CC: <Cokus@math.washington.edu> when you write.
+
+
+
+ uint32 must be an unsigned integer type capable of holding at least 32
+ bits; exactly 32 should be fastest, but 64 is better on an Alpha with
+ GCC at -O3 optimization so try your options and see what's best for you
+
+ Melo: we should put some ifdefs here to catch those alphas...
+*/
+
+typedef unsigned int uint32;
+
+#define N (624) /* length of state vector */
+#define M (397) /* a period parameter */
+#define K (0x9908B0DFU) /* a magic constant */
+#define hiBit(u) ((u) & 0x80000000U) /* mask all but highest bit of u */
+#define loBit(u) ((u) & 0x00000001U) /* mask all but lowest bit of u */
+#define loBits(u) ((u) & 0x7FFFFFFFU) /* mask the highest bit of u */
+#define mixBits(u, v) (hiBit(u)|loBits(v)) /* move hi bit of u to hi bit of v */
+
+static uint32 state[N+1]; /* state vector + 1 extra to not violate ANSI C */
+static uint32 *next; /* next random value is computed from here */
+static int left = -1; /* can *next++ this many times before reloading */
+
+
+static void seedMT(uint32 seed)
+{
+ /*
+ We initialize state[0..(N-1)] via the generator
+
+ x_new = (69069 * x_old) mod 2^32
+
+ from Line 15 of Table 1, p. 106, Sec. 3.3.4 of Knuth's
+ _The Art of Computer Programming_, Volume 2, 3rd ed.
+
+ Notes (SJC): I do not know what the initial state requirements
+ of the Mersenne Twister are, but it seems this seeding generator
+ could be better. It achieves the maximum period for its modulus
+ (2^30) iff x_initial is odd (p. 20-21, Sec. 3.2.1.2, Knuth); if
+ x_initial can be even, you have sequences like 0, 0, 0, ...;
+ 2^31, 2^31, 2^31, ...; 2^30, 2^30, 2^30, ...; 2^29, 2^29 + 2^31,
+ 2^29, 2^29 + 2^31, ..., etc. so I force seed to be odd below.
+
+ Even if x_initial is odd, if x_initial is 1 mod 4 then
+
+ the lowest bit of x is always 1,
+ the next-to-lowest bit of x is always 0,
+ the 2nd-from-lowest bit of x alternates ... 0 1 0 1 0 1 0 1 ... ,
+ the 3rd-from-lowest bit of x 4-cycles ... 0 1 1 0 0 1 1 0 ... ,
+ the 4th-from-lowest bit of x has the 8-cycle ... 0 0 0 1 1 1 1 0 ... ,
+ ...
+
+ and if x_initial is 3 mod 4 then
+
+ the lowest bit of x is always 1,
+ the next-to-lowest bit of x is always 1,
+ the 2nd-from-lowest bit of x alternates ... 0 1 0 1 0 1 0 1 ... ,
+ the 3rd-from-lowest bit of x 4-cycles ... 0 0 1 1 0 0 1 1 ... ,
+ the 4th-from-lowest bit of x has the 8-cycle ... 0 0 1 1 1 1 0 0 ... ,
+ ...
+
+ The generator's potency (min. s>=0 with (69069-1)^s = 0 mod 2^32) is
+ 16, which seems to be alright by p. 25, Sec. 3.2.1.3 of Knuth. It
+ also does well in the dimension 2..5 spectral tests, but it could be
+ better in dimension 6 (Line 15, Table 1, p. 106, Sec. 3.3.4, Knuth).
+
+ Note that the random number user does not see the values generated
+ here directly since reloadMT() will always munge them first, so maybe
+ none of all of this matters. In fact, the seed values made here could
+ even be extra-special desirable if the Mersenne Twister theory says
+ so-- that's why the only change I made is to restrict to odd seeds.
+ */
+
+ register uint32 x = (seed | 1U) & 0xFFFFFFFFU, *s = state;
+ register int j;
+
+ for(left=0, *s++=x, j=N; --j;
+ *s++ = (x*=69069U) & 0xFFFFFFFFU);
+}
+
+
+static uint32 reloadMT(void)
+{
+ register uint32 *p0=state, *p2=state+2, *pM=state+M, s0, s1;
+ register int j;
+
+ if(left < -1)
+ seedMT(4357U);
+
+ left=N-1, next=state+1;
+
+ for(s0=state[0], s1=state[1], j=N-M+1; --j; s0=s1, s1=*p2++)
+ *p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
+
+ for(pM=state, j=M; --j; s0=s1, s1=*p2++)
+ *p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
+
+ s1=state[0], *p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);
+ s1 ^= (s1 >> 11);
+ s1 ^= (s1 << 7) & 0x9D2C5680U;
+ s1 ^= (s1 << 15) & 0xEFC60000U;
+ return(s1 ^ (s1 >> 18));
+}
+
+
+static inline uint32 randomMT(void)
+{
+ uint32 y;
+
+ if(--left < 0)
+ return(reloadMT());
+
+ y = *next++;
+ y ^= (y >> 11);
+ y ^= (y << 7) & 0x9D2C5680U;
+ y ^= (y << 15) & 0xEFC60000U;
+ return(y ^ (y >> 18));
+}
+
+
+#if HAVE_LRAND48
+#define PHP_RAND_MAX 2147483647
+#else
+#define PHP_RAND_MAX RAND_MAX
+#endif
+
+void php3_srand(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg);
+#ifdef HAVE_SRAND48
+ srand48((unsigned int) arg->value.lval);
+#else
+#ifdef HAVE_SRANDOM
+ srandom((unsigned int) arg->value.lval);
+#else
+ srand((unsigned int) arg->value.lval);
+#endif
+#endif
+}
+
+void php3_mt_srand(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(arg);
+ seedMT(arg->value.lval);
+}
+
+void php3_rand(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *p_min=NULL, *p_max=NULL;
+
+ switch (ARG_COUNT(ht)) {
+ case 0:
+ break;
+ case 2:
+ if (getParameters(ht, 2, &p_min, &p_max)==FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_long(p_min);
+ convert_to_long(p_max);
+ if (p_max->value.lval-p_min->value.lval <= 0) {
+ php3_error(E_WARNING,"rand(): Invalid range: %ld..%ld", p_min->value.lval, p_max->value.lval);
+ }
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+
+ return_value->type = IS_LONG;
+#ifdef HAVE_LRAND48
+ return_value->value.lval = lrand48();
+#else
+#ifdef HAVE_RANDOM
+ return_value->value.lval = random();
+#else
+ return_value->value.lval = rand();
+#endif
+#endif
+
+ if (p_min && p_max) { /* implement range */
+ return_value->value.lval = p_min->value.lval +
+ (int)((double)p_max->value.lval * return_value->value.lval/(PHP_RAND_MAX+(double)p_min->value.lval));
+ }
+}
+
+void php3_mt_rand(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *p_min=NULL, *p_max=NULL;
+
+ switch (ARG_COUNT(ht)) {
+ case 0:
+ break;
+ case 2:
+ if (getParameters(ht, 2, &p_min, &p_max)==FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_long(p_min);
+ convert_to_long(p_max);
+ if (p_max->value.lval-p_min->value.lval <= 0) {
+ php3_error(E_WARNING,"mtrand(): Invalid range: %ld..%ld", p_min->value.lval, p_max->value.lval);
+ }
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+
+ return_value->type = IS_LONG;
+ /*
+ * Melo: hmms.. randomMT() returns 32 random bits...
+ * Yet, the previous php3_rand only returns 31 at most.
+ * So I put a right shift to loose the lsb. It *seems*
+ * better than clearing the msb.
+ * Update:
+ * I talked with Cokus via email and it won't ruin the algorithm
+ */
+ return_value->value.lval = (long)(randomMT() >> 1);
+
+ if (p_min && p_max) { /* implement range */
+ return_value->value.lval = p_min->value.lval +
+ (int)((double)p_max->value.lval * return_value->value.lval/(PHP_RAND_MAX+(double)p_min->value.lval));
+ }
+}
+
+void php3_getrandmax(INTERNAL_FUNCTION_PARAMETERS)
+{
+ return_value->type = IS_LONG;
+ return_value->value.lval = PHP_RAND_MAX;
+}
+
+void php3_mt_getrandmax(INTERNAL_FUNCTION_PARAMETERS)
+{
+ return_value->type = IS_LONG;
+ /*
+ * Melo: it could be 2^^32 but we only use 2^^31 to maintain
+ * compatibility with the previous php3_rand
+ */
+ return_value->value.lval = 2147483647; /* 2^^31 */
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/reg.c b/ext/standard/reg.c
new file mode 100644
index 0000000000..42d36493d6
--- /dev/null
+++ b/ext/standard/reg.c
@@ -0,0 +1,569 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ | Jim Winstead <jimw@php.net> |
+ | Jaakko Hyvätti <jaakko@hyvatti.iki.fi> |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include <stdio.h>
+#include "php.h"
+#include "php3_string.h"
+#include "reg.h"
+
+unsigned char third_argument_force_ref[] = { 3, BYREF_NONE, BYREF_NONE, BYREF_FORCE };
+
+function_entry reg_functions[] = {
+ {"ereg", php3_ereg, third_argument_force_ref },
+ {"ereg_replace", php3_eregreplace, NULL },
+ {"eregi", php3_eregi, third_argument_force_ref },
+ {"eregi_replace", php3_eregireplace, NULL },
+ {"split", php3_split, NULL},
+ {"join", php3_implode, NULL},
+ {"sql_regcase", php3_sql_regcase, NULL},
+ {NULL, NULL, NULL}
+};
+
+php3_module_entry regexp_module_entry = {
+ "Regular Expressions", reg_functions, NULL, NULL, NULL, NULL, NULL, STANDARD_MODULE_PROPERTIES
+};
+
+/* This is the maximum number of (..) constructs we'll generate from a
+ call to ereg() or eregi() with the optional third argument. */
+#define NS 10
+
+/*
+ * _php3_reg_eprint - convert error number to name
+ */
+static void _php3_reg_eprint(int err, regex_t *re) {
+ char *buf = NULL, *message = NULL;
+ size_t len;
+ size_t buf_len;
+
+#ifdef REG_ITOA
+ /* get the length of the message */
+ buf_len = regerror(REG_ITOA | err, re, NULL, 0);
+ if (buf_len) {
+ buf = (char *)emalloc(buf_len * sizeof(char));
+ if (!buf) return; /* fail silently */
+ /* finally, get the error message */
+ regerror(REG_ITOA | err, re, buf, buf_len);
+ }
+#else
+ buf_len = 0;
+#endif
+ len = regerror(err, re, NULL, 0);
+ if (len) {
+ message = (char *)emalloc((buf_len + len + 2) * sizeof(char));
+ if (!message) {
+ return; /* fail silently */
+ }
+ if (buf_len) {
+ snprintf(message, buf_len, "%s: ", buf);
+ buf_len += 1; /* so pointer math below works */
+ }
+ /* drop the message into place */
+ regerror(err, re, message + buf_len, len);
+
+ php3_error(E_WARNING, "%s", message);
+ }
+
+ STR_FREE(buf);
+ STR_FREE(message);
+}
+
+static void _php3_ereg(INTERNAL_FUNCTION_PARAMETERS, int icase)
+{
+ pval *regex, /* Regular expression */
+ *findin, /* String to apply expression to */
+ *array = NULL; /* Optional register array */
+ regex_t re;
+ regmatch_t subs[NS];
+ int err, i, match_len, string_len;
+ int copts = 0;
+ off_t start, end;
+ char *buf = NULL;
+ char *string = NULL;
+ TLS_VARS;
+
+ if (icase)
+ copts |= REG_ICASE;
+
+ switch(ARG_COUNT(ht)) {
+ case 2:
+ if (getParameters(ht, 2, &regex, &findin) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ /* don't bother doing substring matching if we're not going
+ to make use of the information */
+ copts |= REG_NOSUB;
+ break;
+ case 3:
+ if (getParameters(ht, 3, &regex, &findin, &array) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ if (!ParameterPassedByReference(ht, 3)) {
+ php3_error(E_WARNING, "Array to be filled with values must be passed by reference.");
+ RETURN_FALSE;
+ }
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+
+
+ /* compile the regular expression from the supplied regex */
+ if (regex->type == IS_STRING) {
+ err = regcomp(&re, regex->value.str.val, REG_EXTENDED | copts);
+ } else {
+ /* we convert numbers to integers and treat them as a string */
+ if (regex->type == IS_DOUBLE)
+ convert_to_long(regex); /* get rid of decimal places */
+ convert_to_string(regex);
+ /* don't bother doing an extended regex with just a number */
+ err = regcomp(&re, regex->value.str.val, copts);
+ }
+
+ if (err) {
+ _php3_reg_eprint(err, &re);
+ RETURN_FALSE;
+ }
+
+ /* make a copy of the string we're looking in */
+ convert_to_string(findin);
+ string = estrndup(findin->value.str.val, findin->value.str.len);
+
+ /* actually execute the regular expression */
+ err = regexec(&re, string, (size_t) NS, subs, 0);
+ if (err && err != REG_NOMATCH) {
+ _php3_reg_eprint(err, &re);
+ regfree(&re);
+ RETURN_FALSE;
+ }
+ match_len = 1;
+
+ if (array && err != REG_NOMATCH) {
+ match_len = (int) (subs[0].rm_eo - subs[0].rm_so);
+ string_len = strlen(string) + 1;
+
+ buf = emalloc(string_len);
+ if (!buf) {
+ php3_error(E_WARNING, "Unable to allocate memory in _php3_ereg");
+ RETURN_FALSE;
+ }
+
+ pval_destructor(array _INLINE_TLS); /* start with clean array */
+ array_init(array);
+
+ for (i = 0; i < NS; i++) {
+ start = subs[i].rm_so;
+ end = subs[i].rm_eo;
+ if (start != -1 && end > 0 && start < string_len && end < string_len && start < end) {
+ add_index_stringl(array, i, string+start, end-start, 1);
+ }
+ }
+ efree(buf);
+ }
+
+ efree(string);
+ if (err == REG_NOMATCH) {
+ RETVAL_FALSE;
+ } else {
+ if (match_len == 0)
+ match_len = 1;
+ RETVAL_LONG(match_len);
+ }
+ regfree(&re);
+}
+
+/* {{{ proto int ereg(string pattern, string string [, array registers])
+ Regular expression match */
+void php3_ereg(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_ereg(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+
+/* {{{ proto int eregi(string pattern, string string [, array registers])
+ Case-insensitive regular expression match */
+void php3_eregi(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_ereg(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+/* }}} */
+
+/* this is the meat and potatoes of regex replacement! */
+char *_php3_regreplace(const char *pattern, const char *replace, const char *string, int icase, int extended)
+{
+ regex_t re;
+ regmatch_t subs[NS];
+
+ char *buf, /* buf is where we build the replaced string */
+ *nbuf, /* nbuf is used when we grow the buffer */
+ *walkbuf; /* used to walk buf when replacing backrefs */
+ const char *walk; /* used to walk replacement string for backrefs */
+ int buf_len;
+ int pos, tmp, string_len, new_l;
+ int err, copts = 0;
+
+ string_len = strlen(string);
+ if (!string_len)
+ return (char *)string;
+
+ if (icase)
+ copts = REG_ICASE;
+ if (extended)
+ copts |= REG_EXTENDED;
+ err = regcomp(&re, pattern, copts);
+ if (err) {
+ _php3_reg_eprint(err, &re);
+ return ((char *) -1);
+ }
+
+ /* start with a buffer that is twice the size of the stringo
+ we're doing replacements in */
+ buf_len = 2 * string_len + 1;
+ buf = emalloc(buf_len * sizeof(char));
+ if (!buf) {
+ php3_error(E_WARNING, "Unable to allocate memory in _php3_regreplace");
+ regfree(&re);
+ return ((char *) -1);
+ }
+
+ err = pos = 0;
+ buf[0] = '\0';
+
+ while (!err) {
+ err = regexec(&re, &string[pos], (size_t) NS, subs, (pos ? REG_NOTBOL : 0));
+
+ if (err && err != REG_NOMATCH) {
+ _php3_reg_eprint(err, &re);
+ regfree(&re);
+ return ((char *) -1);
+ }
+ if (!err) {
+ /* backref replacement is done in two passes:
+ 1) find out how long the string will be, and allocate buf
+ 2) copy the part before match, replacement and backrefs to buf
+
+ Jaakko Hyvätti <Jaakko.Hyvatti@iki.fi>
+ */
+
+ new_l = strlen(buf) + subs[0].rm_so; /* part before the match */
+ walk = replace;
+ while (*walk)
+ if ('\\' == *walk
+ && '0' <= walk[1] && '9' >= walk[1]
+ && subs[walk[1] - '0'].rm_so > -1
+ && subs[walk[1] - '0'].rm_eo > -1) {
+ new_l += subs[walk[1] - '0'].rm_eo
+ - subs[walk[1] - '0'].rm_so;
+ walk += 2;
+ } else {
+ new_l++;
+ walk++;
+ }
+
+ if (new_l + 1 > buf_len) {
+ buf_len = 1 + buf_len + 2 * new_l;
+ nbuf = emalloc(buf_len);
+ strcpy(nbuf, buf);
+ efree(buf);
+ buf = nbuf;
+ }
+ tmp = strlen(buf);
+ /* copy the part of the string before the match */
+ strncat(buf, &string[pos], subs[0].rm_so);
+
+ /* copy replacement and backrefs */
+ walkbuf = &buf[tmp + subs[0].rm_so];
+ walk = replace;
+ while (*walk)
+ if ('\\' == *walk
+ && '0' <= walk[1] && '9' >= walk[1]
+ && subs[walk[1] - '0'].rm_so > -1
+ && subs[walk[1] - '0'].rm_eo > -1) {
+ tmp = subs[walk[1] - '0'].rm_eo
+ - subs[walk[1] - '0'].rm_so;
+ memcpy (walkbuf,
+ &string[pos + subs[walk[1] - '0'].rm_so],
+ tmp);
+ walkbuf += tmp;
+ walk += 2;
+ } else
+ *walkbuf++ = *walk++;
+ *walkbuf = '\0';
+
+ /* and get ready to keep looking for replacements */
+ if (subs[0].rm_so == subs[0].rm_eo) {
+ if (subs[0].rm_so + pos >= string_len)
+ break;
+ new_l = strlen (buf) + 1;
+ if (new_l + 1 > buf_len) {
+ buf_len = 1 + buf_len + 2 * new_l;
+ nbuf = emalloc(buf_len * sizeof(char));
+ strcpy(nbuf, buf);
+ efree(buf);
+ buf = nbuf;
+ }
+ pos += subs[0].rm_eo + 1;
+ buf [new_l-1] = string [pos-1];
+ buf [new_l] = '\0';
+ } else {
+ pos += subs[0].rm_eo;
+ }
+ } else { /* REG_NOMATCH */
+ new_l = strlen(buf) + strlen(&string[pos]);
+ if (new_l + 1 > buf_len) {
+ buf_len = new_l + 1; /* now we know exactly how long it is */
+ nbuf = emalloc(buf_len * sizeof(char));
+ strcpy(nbuf, buf);
+ efree(buf);
+ buf = nbuf;
+ }
+ /* stick that last bit of string on our output */
+ strcat(buf, &string[pos]);
+ }
+ }
+
+ /* don't want to leak memory .. */
+ regfree(&re);
+
+ /* whew. */
+ return (buf);
+}
+
+static void _php3_eregreplace(INTERNAL_FUNCTION_PARAMETERS, int icase)
+{
+ pval *arg_pattern,
+ *arg_replace,
+ *arg_string;
+ char *pattern;
+ char *string;
+ char *replace;
+ char *ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &arg_pattern, &arg_replace, &arg_string) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ if (arg_pattern->type == IS_STRING) {
+ if (arg_pattern->value.str.val && arg_pattern->value.str.len)
+ pattern = estrndup(arg_pattern->value.str.val,arg_pattern->value.str.len);
+ else
+ pattern = empty_string;
+ } else {
+ convert_to_long(arg_pattern);
+ pattern = emalloc(2);
+ pattern[0] = (char) arg_pattern->value.lval;
+ pattern[1] = '\0';
+ }
+
+ if (arg_replace->type == IS_STRING) {
+ if (arg_replace->value.str.val && arg_replace->value.str.len)
+ replace = estrndup(arg_replace->value.str.val, arg_replace->value.str.len);
+ else
+ replace = empty_string;
+ } else {
+ convert_to_long(arg_replace);
+ replace = emalloc(2);
+ replace[0] = (char) arg_replace->value.lval;
+ replace[1] = '\0';
+ }
+
+ convert_to_string(arg_string);
+ if (arg_string->value.str.val && arg_string->value.str.len)
+ string = estrndup(arg_string->value.str.val, arg_string->value.str.len);
+ else
+ string = empty_string;
+
+ /* do the actual work */
+ ret = _php3_regreplace(pattern, replace, string, icase, 1);
+ if (ret == (char *) -1) {
+ RETVAL_FALSE;
+ } else {
+ RETVAL_STRING(ret,1);
+ STR_FREE(ret);
+ }
+ STR_FREE(string);
+ STR_FREE(replace);
+ STR_FREE(pattern);
+}
+
+/* {{{ proto string ereg_replace(string pattern, string string [, array registers])
+ Replace regular expression */
+void php3_eregreplace(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_eregreplace(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+
+/* {{{ proto string eregi_replace(string pattern, string string [, array registers])
+ Case insensitive replace regular expression */
+void php3_eregireplace(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_eregreplace(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+/* }}} */
+
+/* ("root", "passwd", "uid", "gid", "other:stuff:like:/bin/sh")
+ = split(":", $passwd_file, 5); */
+/* {{{ proto array split(string pattern, string string [, int limit])
+ split string into array by regular expression */
+void php3_split(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *spliton, *str, *arg_count = NULL;
+ regex_t re;
+ regmatch_t subs[1];
+ char *strp, *endp;
+ int err, size, count;
+ TLS_VARS;
+
+ switch (ARG_COUNT(ht)) {
+ case 2:
+ if (getParameters(ht, 2, &spliton, &str) == FAILURE)
+ WRONG_PARAM_COUNT;
+ count = -1;
+ break;
+ case 3:
+ if (getParameters(ht, 3, &spliton, &str, &arg_count) == FAILURE)
+ WRONG_PARAM_COUNT;
+ convert_to_long(arg_count);
+ count = arg_count->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(spliton);
+ convert_to_string(str);
+
+ strp = str->value.str.val;
+ endp = str->value.str.val + strlen(str->value.str.val);
+
+ err = regcomp(&re, spliton->value.str.val, REG_EXTENDED);
+ if (err) {
+ php3_error(E_WARNING, "unexpected regex error (%d)", err);
+ RETURN_FALSE;
+ }
+
+ if (array_init(return_value) == FAILURE) {
+ regfree(&re);
+ RETURN_FALSE;
+ }
+
+ /* churn through str, generating array entries as we go */
+ while ((count == -1 || count > 1) && !(err = regexec(&re, strp, 1, subs, 0))) {
+ if (subs[0].rm_so == 0 && subs[0].rm_eo) {
+ /* match is at start of string, return empty string */
+ add_next_index_stringl(return_value, empty_string, 0, 1);
+ /* skip ahead the length of the regex match */
+ strp+=subs[0].rm_eo;
+ } else if (subs[0].rm_so==0 && subs[0].rm_eo==0) {
+ /* No more matches */
+ regfree(&re);
+ php3_error(E_WARNING, "bad regular expression for split()");
+ _php3_hash_destroy(return_value->value.ht);
+ efree(return_value->value.ht);
+ RETURN_FALSE;
+ } else {
+ /* On a real match */
+
+ /* make a copy of the substring */
+ size = subs[0].rm_so;
+
+ /* add it to the array */
+ add_next_index_stringl(return_value, strp, size, 1);
+
+ /* point at our new starting point */
+ strp = strp + subs[0].rm_eo;
+ }
+
+ /* if we're only looking for a certain number of points,
+ stop looking once we hit it */
+ if (count != -1) count--;
+ }
+
+ /* see if we encountered an error */
+ if (err && err != REG_NOMATCH) {
+ php3_error(E_WARNING, "unexpected regex error (%d)", err);
+ regfree(&re);
+ _php3_hash_destroy(return_value->value.ht);
+ efree(return_value->value.ht);
+ RETURN_FALSE;
+ }
+
+ /* otherwise we just have one last element to add to the array */
+ size = endp - strp;
+
+ add_next_index_stringl(return_value, strp, size, 1);
+
+ regfree(&re);
+
+ return;
+}
+/* }}} */
+
+/* {{{ proto string sql_regcase(string string)
+ Make regular expression for case insensitive match */
+PHPAPI void php3_sql_regcase(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *string;
+ char *tmp;
+ register int i;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &string)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(string);
+
+ tmp = (char *) emalloc(string->value.str.len*4+1);
+
+ for (i=0; i<string->value.str.len; i++) {
+ tmp[i*4] = '[';
+ tmp[i*4+1]=toupper((unsigned char)string->value.str.val[i]);
+ tmp[i*4+2]=tolower((unsigned char)string->value.str.val[i]);
+ tmp[i*4+3]=']';
+ }
+ tmp[string->value.str.len*4]=0;
+
+ return_value->value.str.val = tmp;
+ return_value->value.str.len = string->value.str.len*4;
+ return_value->type = IS_STRING;
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/reg.h b/ext/standard/reg.h
new file mode 100644
index 0000000000..bb33aa768f
--- /dev/null
+++ b/ext/standard/reg.h
@@ -0,0 +1,48 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+#ifndef _REG_H
+#define _REG_H
+
+extern php3_module_entry regexp_module_entry;
+#define regexp_module_ptr &regexp_module_entry
+
+extern char *_php3_regreplace(const char *pattern, const char *replace, const char *string, int icase, int extended);
+
+extern void php3_ereg(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_eregi(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_eregireplace(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_eregreplace(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_split(INTERNAL_FUNCTION_PARAMETERS);
+extern PHPAPI void php3_sql_regcase(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _REG_H */
diff --git a/ext/standard/soundex.c b/ext/standard/soundex.c
new file mode 100644
index 0000000000..24eef3fcc9
--- /dev/null
+++ b/ext/standard/soundex.c
@@ -0,0 +1,136 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Author: Bjørn Borud - Guardian Networks AS <borud@guardian.no> |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+
+#include "php.h"
+#include <stdlib.h>
+#include <errno.h>
+#include <ctype.h>
+#include "php3_string.h"
+
+/* Simple soundex algorithm as described by Knuth in TAOCP, vol 3 */
+/* {{{ proto string soundex(string str)
+ Calculate the soundex key of a string */
+void soundex(INTERNAL_FUNCTION_PARAMETERS)
+{
+ char l, u;
+ char *somestring;
+ int i, j, n;
+ pval *arg;
+
+ /* pad with '0' and terminate with 0 ;-) */
+ char soundex[5] =
+ {'0', '0', '0', '0', 0};
+
+ static char soundex_table[26] =
+ {0, /* A */
+ '1', /* B */
+ '2', /* C */
+ '3', /* D */
+ 0, /* E */
+ '1', /* F */
+ '2', /* G */
+ 0, /* H */
+ 0, /* I */
+ '2', /* J */
+ '2', /* K */
+ '4', /* L */
+ '5', /* M */
+ '5', /* N */
+ 0, /* O */
+ '1', /* P */
+ '2', /* Q */
+ '6', /* R */
+ '2', /* S */
+ '3', /* T */
+ 0, /* U */
+ '1', /* V */
+ 0, /* W */
+ '2', /* X */
+ 0, /* Y */
+ '2'}; /* Z */
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+ if (arg->value.str.len==0) {
+ RETURN_FALSE;
+ }
+
+ somestring = arg->value.str.val;
+
+ n = arg->value.str.len;
+
+ /* convert chars to upper case and strip non-letter chars */
+ j = 0;
+ for (i = 0; i < n; i++) {
+ u = toupper(somestring[i]);
+ if ((u > 64) && (u < 91)) {
+ somestring[j] = u;
+ j++;
+ }
+ }
+
+ /* null-terminate string */
+ somestring[j] = 0;
+
+ n = strlen(somestring);
+
+ /* prefix soundex string with first valid char */
+ soundex[0] = somestring[0];
+
+ /* remember first char */
+ l = soundex_table[((somestring[0]) - 65)];
+
+ j = 1;
+
+ /* build soundex string */
+ for (i = 1; i < n && j < 4; i++) {
+ u = soundex_table[((somestring[i]) - 65)];
+
+ if (u != l) {
+ if (u != 0) {
+ soundex[(int) j++] = u;
+ }
+ l = u;
+ }
+ }
+
+ return_value->value.str.val = estrndup(soundex, 4);
+ return_value->value.str.len = strlen(soundex);
+ return_value->type = IS_STRING;
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/string.c b/ext/standard/string.c
new file mode 100644
index 0000000000..8700bb3f4a
--- /dev/null
+++ b/ext/standard/string.c
@@ -0,0 +1,1590 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ | Stig Sæther Bakken <ssb@guardian.no> |
+ | Zeev Suraski <bourbon@nevision.net.il> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include <stdio.h>
+#include "php.h"
+#include "reg.h"
+#include "post.h"
+#include "php3_string.h"
+#if HAVE_SETLOCALE
+#include <locale.h>
+#endif
+#include "zend_execute.h"
+#include "php_globals.h"
+
+
+/* {{{ proto int strlen(string str)
+ Get string length */
+void php3_strlen(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+ RETVAL_LONG(str->value.str.len);
+}
+/* }}} */
+
+/* {{{ proto int strcmp(string str1, string str2)
+ Binary safe string comparison */
+void php3_strcmp(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *s1,*s2;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &s1, &s2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(s1);
+ convert_to_string(s2);
+ RETURN_LONG(php3_binary_strcmp(s1,s2));
+}
+/* }}} */
+
+/* {{{ proto int strcasecmp(string str1, string str2)
+ Binary safe case-insensitive string comparison */
+void php3_strcasecmp(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *s1,*s2;
+
+ if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &s1, &s2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(s1);
+ convert_to_string(s2);
+ RETURN_LONG(strcasecmp(s1->value.str.val,s2->value.str.val));
+}
+/* }}} */
+
+/* {{{ proto int strspn(string str, string mask)
+ Find length of initial segment consisting entirely of characters found in mask */
+void php3_strspn(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *s1,*s2;
+
+ if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &s1, &s2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(s1);
+ convert_to_string(s2);
+ RETURN_LONG(strspn(s1->value.str.val,s2->value.str.val));
+}
+/* }}} */
+
+/* {{{ proto int strcspn(string str, string mask)
+ Find length of initial segment consisting entirely of characters not found in mask */
+void php3_strcspn(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *s1,*s2;
+
+ if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &s1, &s2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(s1);
+ convert_to_string(s2);
+ RETURN_LONG(strcspn(s1->value.str.val,s2->value.str.val));
+}
+/* }}} */
+
+/* {{{ proto string chop(string str)
+ Remove trailing whitespace */
+void php3_chop(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str;
+ register int i;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+
+ if (str->type == IS_STRING) {
+ int len = str->value.str.len;
+ char *c = str->value.str.val;
+ for (i = len - 1; i >= 0; i--) {
+ if (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' ||
+ c[i] == '\t' || c[i] == '\v') {
+ len--;
+ } else {
+ break;
+ }
+ }
+ RETVAL_STRINGL(c, len, 1);
+ return;
+ }
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto string trim(string str)
+ Strip whitespace from the beginning and end of a string */
+void php3_trim(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str;
+ register int i;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+
+ if (str->type == IS_STRING) {
+ int len = str->value.str.len;
+ int trimmed = 0;
+ char *c = str->value.str.val;
+ for (i = 0; i < len; i++) {
+ if (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' ||
+ c[i] == '\t' || c[i] == '\v') {
+ trimmed++;
+ } else {
+ break;
+ }
+ }
+ len-=trimmed;
+ c+=trimmed;
+ for (i = len - 1; i >= 0; i--) {
+ if (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' ||
+ c[i] == '\t' || c[i] == '\v') {
+ len--;
+ } else {
+ break;
+ }
+ }
+ RETVAL_STRINGL(c, len, 1);
+ return;
+ }
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto string ltrim(string str)
+ Strip whitespace from the beginning of a string */
+void php3_ltrim(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str;
+ register int i;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+
+ if (str->type == IS_STRING) {
+ int len = str->value.str.len;
+ int trimmed = 0;
+ char *c = str->value.str.val;
+ for (i = 0; i < len; i++) {
+ if (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' ||
+ c[i] == '\t' || c[i] == '\v') {
+ trimmed++;
+ } else {
+ break;
+ }
+ }
+ RETVAL_STRINGL(c+trimmed, len-trimmed, 1);
+ return;
+ }
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto array(string separator, string str)
+ Split a string on string separator and return array of components */
+void php3_explode(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str, *delim;
+ char *work_str, *p1, *p2;
+ int i = 0;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &delim, &str) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+ convert_to_string(delim);
+
+ if (strlen(delim->value.str.val)==0) {
+ /* the delimiter must be a valid C string that's at least 1 character long */
+ php3_error(E_WARNING,"Empty delimiter");
+ RETURN_FALSE;
+ }
+ if (array_init(return_value) == FAILURE) {
+ return;
+ }
+ work_str = p1 = estrndup(str->value.str.val,str->value.str.len);
+ p2 = strstr(p1, delim->value.str.val);
+ if (p2 == NULL) {
+ add_index_string(return_value, i++, p1, 1);
+ } else do {
+ p2[0] = 0;
+ add_index_string(return_value, i++, p1, 1);
+ p1 = p2 + delim->value.str.len;
+ } while ((p2 = strstr(p1, delim->value.str.val)) && p2 != work_str);
+ if (p1 != work_str) {
+ add_index_string(return_value, i++, p1, 1);
+ }
+ efree(work_str);
+}
+/* }}} */
+
+/* {{{ proto string implode(array src, string glue)
+ Join array elements placing glue string between items and return one string */
+void php3_implode(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg1, *arg2, *delim, *tmp, *arr;
+ int len = 0, count = 0;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ if (arg1->type == IS_ARRAY && arg2->type == IS_STRING) {
+ arr = arg1;
+ delim = arg2;
+ } else if (arg2->type == IS_ARRAY) {
+ convert_to_string(arg1);
+ arr = arg2;
+ delim = arg1;
+ } else {
+ php3_error(E_WARNING, "Bad arguments to %s()",
+ get_active_function_name());
+ return;
+ }
+
+ /* convert everything to strings, and calculate length */
+ _php3_hash_internal_pointer_reset(arr->value.ht);
+ while (_php3_hash_get_current_data(arr->value.ht, (void **) &tmp) == SUCCESS) {
+ convert_to_string(tmp);
+ if (tmp->type == IS_STRING) {
+ len += tmp->value.str.len;
+ if (count>0) {
+ len += delim->value.str.len;
+ }
+ count++;
+ }
+ _php3_hash_move_forward(arr->value.ht);
+ }
+
+ /* do it */
+ return_value->value.str.val = (char *) emalloc(len + 1);
+ return_value->value.str.val[0] = '\0';
+ return_value->value.str.val[len] = '\0';
+ _php3_hash_internal_pointer_reset(arr->value.ht);
+ while (_php3_hash_get_current_data(arr->value.ht, (void **) &tmp) == SUCCESS) {
+ if (tmp->type == IS_STRING) {
+ count--;
+ strcat(return_value->value.str.val, tmp->value.str.val);
+ if (count > 0) {
+ strcat(return_value->value.str.val, delim->value.str.val);
+ }
+ }
+ _php3_hash_move_forward(arr->value.ht);
+ }
+ return_value->type = IS_STRING;
+ return_value->value.str.len = len;
+}
+/* }}} */
+
+#ifndef THREAD_SAFE
+char *strtok_string;
+#endif
+
+/* {{{ proto string strtok([string str,] string token)
+ Tokenize a string */
+void php3_strtok(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str, *tok;
+#ifndef THREAD_SAFE
+ static char *strtok_pos1 = NULL;
+ static char *strtok_pos2 = NULL;
+#endif
+ char *token = NULL, *tokp=NULL;
+ char *first = NULL;
+ int argc;
+ TLS_VARS;
+
+ argc = ARG_COUNT(ht);
+
+ if ((argc == 1 && getParameters(ht, 1, &tok) == FAILURE) ||
+ (argc == 2 && getParameters(ht, 2, &str, &tok) == FAILURE) ||
+ argc < 1 || argc > 2) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(tok);
+ tokp = token = tok->value.str.val;
+
+ if (argc == 2) {
+ convert_to_string(str);
+
+ STR_FREE(GLOBAL(strtok_string));
+ GLOBAL(strtok_string) = estrndup(str->value.str.val,str->value.str.len);
+ STATIC(strtok_pos1) = GLOBAL(strtok_string);
+ STATIC(strtok_pos2) = NULL;
+ }
+ if (STATIC(strtok_pos1) && *STATIC(strtok_pos1)) {
+ for ( /* NOP */ ; token && *token; token++) {
+ STATIC(strtok_pos2) = strchr(STATIC(strtok_pos1), (int) *token);
+ if (!first || (STATIC(strtok_pos2) && STATIC(strtok_pos2) < first)) {
+ first = STATIC(strtok_pos2);
+ }
+ } /* NB: token is unusable now */
+
+ STATIC(strtok_pos2) = first;
+ if (STATIC(strtok_pos2)) {
+ *STATIC(strtok_pos2) = '\0';
+ }
+ RETVAL_STRING(STATIC(strtok_pos1),1);
+#if 0
+ /* skip 'token' white space for next call to strtok */
+ while (STATIC(strtok_pos2) &&
+ strchr(tokp, *(STATIC(strtok_pos2)+1))) {
+ STATIC(strtok_pos2)++;
+ }
+#endif
+ if (STATIC(strtok_pos2))
+ STATIC(strtok_pos1) = STATIC(strtok_pos2) + 1;
+ else
+ STATIC(strtok_pos1) = NULL;
+ } else {
+ RETVAL_FALSE;
+ }
+}
+/* }}} */
+
+PHPAPI char *_php3_strtoupper(char *s)
+{
+ char *c;
+ int ch;
+
+ c = s;
+ while (*c) {
+ ch = toupper((unsigned char)*c);
+ *c++ = ch;
+ }
+ return (s);
+}
+
+/* {{{ proto string strtoupper(string str)
+ Make a string uppercase */
+void php3_strtoupper(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ char *ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg)) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ ret = _php3_strtoupper(arg->value.str.val);
+ RETVAL_STRING(ret,1);
+}
+/* }}} */
+
+
+PHPAPI char *_php3_strtolower(char *s)
+{
+ register int ch;
+ char *c;
+
+ c = s;
+ while (*c) {
+ ch = tolower((unsigned char)*c);
+ *c++ = ch;
+ }
+ return (s);
+}
+
+/* {{{ proto string strtolower(string str)
+ Make a string lowercase */
+void php3_strtolower(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str;
+ char *ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str)) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+
+ ret = _php3_strtolower(str->value.str.val);
+ RETVAL_STRING(ret,1);
+}
+/* }}} */
+
+/* {{{ proto string basename(string path)
+ Return the filename component of the path */
+void php3_basename(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str;
+ char *ret, *c;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str)) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+ ret = estrdup(str->value.str.val);
+ c = ret + str->value.str.len -1;
+ while (*c == '/'
+#ifdef MSVC5
+ || *c == '\\'
+#endif
+ )
+ c--;
+ *(c + 1) = '\0';
+ if ((c = strrchr(ret, '/'))
+#ifdef MSVC5
+ || (c = strrchr(ret, '\\'))
+#endif
+ ) {
+ RETVAL_STRING(c + 1,1);
+ } else {
+ RETVAL_STRING(str->value.str.val,1);
+ }
+ efree(ret);
+}
+/* }}} */
+
+PHPAPI void _php3_dirname(char *str, int len) {
+ register char *c;
+
+ c = str + len - 1;
+ while (*c == '/'
+#ifdef MSVC5
+ || *c == '\\'
+#endif
+ )
+ c--; /* strip trailing slashes */
+ *(c + 1) = '\0';
+ if ((c = strrchr(str, '/'))
+#ifdef MSVC5
+ || (c = strrchr(str, '\\'))
+#endif
+ )
+ *c='\0';
+}
+
+/* {{{ proto string dirname(string path)
+ Return the directory name component of the path */
+void php3_dirname(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str;
+ char *ret;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str)) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+ ret = estrdup(str->value.str.val);
+ _php3_dirname(ret,str->value.str.len);
+ RETVAL_STRING(ret,1);
+ efree(ret);
+}
+/* }}} */
+
+
+/* case-insensitve strstr */
+PHPAPI char *php3i_stristr(unsigned char *s, unsigned char *t)
+{
+ int i, j, k, l;
+
+ for (i = 0; s[i]; i++) {
+ for (j = 0, l = k = i; s[k] && t[j] &&
+ tolower(s[k]) == tolower(t[j]); j++, k++)
+ ;
+ if (t[j] == '\0')
+ return s + l;
+ }
+ return NULL;
+}
+
+/* {{{ proto string strstr(string haystack, string needle)
+ Find first occurrence of a string within another, case insensitive */
+void php3_stristr(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *haystack, *needle;
+ char *found = NULL;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &haystack, &needle) ==
+ FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(haystack);
+ convert_to_string(needle);
+
+ if (strlen(needle->value.str.val)==0) {
+ php3_error(E_WARNING,"Empty delimiter");
+ RETURN_FALSE;
+ }
+ found = php3i_stristr(haystack->value.str.val, needle->value.str.val);
+
+ if (found) {
+ RETVAL_STRING(found,1);
+ } else {
+ RETVAL_FALSE;
+ }
+}
+/* }}} */
+
+/* {{{ proto string strstr(string haystack, string needle)
+ Find first occurrence of a string within another */
+void php3_strstr(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *haystack, *needle;
+ char *found = NULL;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &haystack, &needle) ==
+ FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(haystack);
+
+ if (needle->type == IS_STRING) {
+ if (strlen(needle->value.str.val)==0) {
+ php3_error(E_WARNING,"Empty delimiter");
+ RETURN_FALSE;
+ }
+ found = strstr(haystack->value.str.val, needle->value.str.val);
+ } else {
+ convert_to_long(needle);
+ found = strchr(haystack->value.str.val, (char) needle->value.lval);
+ }
+
+
+ if (found) {
+ RETVAL_STRING(found,1);
+ } else {
+ RETVAL_FALSE;
+ }
+}
+/* }}} */
+
+/* {{{ proto int strpos(string haystack, string needle)
+ Find position of first occurrence of a string within another */
+void php3_strpos(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *haystack, *needle, *OFFSET;
+ int offset = 0;
+ char *found = NULL;
+ TLS_VARS;
+
+ switch(ARG_COUNT(ht)) {
+ case 2:
+ if (getParameters(ht, 2, &haystack, &needle) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ break;
+ case 3:
+ if (getParameters(ht, 3, &haystack, &needle, &OFFSET) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(OFFSET);
+ offset = OFFSET->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(haystack);
+ if (offset > haystack->value.str.len) {
+ php3_error(E_WARNING,"offset not contained in string");
+ RETURN_FALSE;
+ }
+
+ if (needle->type == IS_STRING) {
+ if (needle->value.str.len==0) {
+ php3_error(E_WARNING,"Empty delimiter");
+ RETURN_FALSE;
+ }
+ found = strstr(haystack->value.str.val+offset, needle->value.str.val);
+ } else {
+ convert_to_long(needle);
+ found = strchr(haystack->value.str.val+offset, (char) needle->value.lval);
+ }
+
+ if (found) {
+ RETVAL_LONG(found - haystack->value.str.val);
+ } else {
+ RETVAL_FALSE;
+ }
+}
+/* }}} */
+
+/* {{{ proto int strrpos(string haystack, string needle)
+ Find the last occurrence of a character in a string within another */
+void php3_strrpos(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *haystack, *needle;
+ char *found = NULL;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &haystack, &needle) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(haystack);
+
+ if (needle->type == IS_STRING) {
+ found = strrchr(haystack->value.str.val, *needle->value.str.val);
+ } else {
+ convert_to_long(needle);
+ found = strrchr(haystack->value.str.val, (char) needle->value.lval);
+ }
+
+ if (found) {
+ RETVAL_LONG(haystack->value.str.len - strlen(found));
+ } else {
+ RETVAL_FALSE;
+ }
+}
+/* }}} */
+
+/* {{{ proto string strrchr(string haystack, string needle)
+ Find the last occurrence of a character in a string within another */
+void php3_strrchr(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *haystack, *needle;
+ char *found = NULL;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &haystack, &needle) ==
+ FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(haystack);
+
+ if (needle->type == IS_STRING) {
+ found = strrchr(haystack->value.str.val, *needle->value.str.val);
+ } else {
+
+ convert_to_long(needle);
+ found = strrchr(haystack->value.str.val, needle->value.lval);
+ }
+
+
+ if (found) {
+ RETVAL_STRING(found,1);
+ } else {
+ RETVAL_FALSE;
+ }
+}
+/* }}} */
+
+static char *
+_php3_chunk_split(char *src, int srclen, char *end, int endlen, int chunklen)
+{
+ char *dest;
+ char *p, *q;
+ int chunks; /* complete chunks! */
+ int restlen;
+
+ chunks = srclen / chunklen;
+ restlen = srclen - chunks * chunklen; /* srclen % chunklen */
+
+ dest = emalloc((srclen + (chunks + 1) * endlen + 1) * sizeof(char));
+
+ for(p = src, q = dest; p < (src + srclen - chunklen + 1); ) {
+ memcpy(q, p, chunklen);
+ q += chunklen;
+ memcpy(q, end, endlen);
+ q += endlen;
+ p += chunklen;
+ }
+
+ if(restlen) {
+ memcpy(q, p, restlen);
+ q += restlen;
+ memcpy(q, end, endlen);
+ q += endlen;
+ }
+
+ *q = '\0';
+
+ return(dest);
+}
+
+/* {{{ proto string chunk_split(string str [, int chunklen [, string ending]])
+ Return split line */
+void php3_chunk_split(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *p_str, *p_chunklen, *p_ending;
+ int argc;
+ char *result;
+ char *end = "\r\n";
+ int endlen = 2;
+ int chunklen = 76;
+ TLS_VARS;
+
+ argc = ARG_COUNT(ht);
+
+ if(!((argc == 1 && getParameters(ht, 1, &p_str) != FAILURE) ||
+ (argc == 2 && getParameters(ht, 2, &p_str, &p_chunklen) != FAILURE) ||
+ (argc == 3 && getParameters(ht, 3, &p_str, &p_chunklen,
+ &p_ending) != FAILURE))) {
+ WRONG_PARAM_COUNT;
+ }
+
+ switch(argc) {
+ case 3:
+ convert_to_string(p_ending);
+ end = p_ending->value.str.val;
+ endlen = p_ending->value.str.len;
+ case 2:
+ convert_to_long(p_chunklen);
+ chunklen = p_chunklen->value.lval;
+ case 1:
+ convert_to_string(p_str);
+ }
+
+ if(chunklen == 0) {
+ php3_error(E_WARNING, "chunk length is 0");
+ RETURN_FALSE;
+ }
+
+ result = _php3_chunk_split(p_str->value.str.val, p_str->value.str.len,
+ end, endlen, chunklen);
+
+ if(result) {
+ RETVAL_STRING(result, 0);
+ } else {
+ RETURN_FALSE;
+ }
+}
+/* }}} */
+
+/* {{{ proto string substr(string str, int start [, int length])
+ Return part of a string */
+void php3_substr(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *string, *from, *len;
+ int argc, l;
+ int f;
+ TLS_VARS;
+
+ argc = ARG_COUNT(ht);
+
+ if ((argc == 2 && getParameters(ht, 2, &string, &from) == FAILURE) ||
+ (argc == 3 && getParameters(ht, 3, &string, &from, &len) == FAILURE) ||
+ argc < 2 || argc > 3) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(string);
+ convert_to_long(from);
+ f = from->value.lval;
+
+ if (argc == 2) {
+ l = string->value.str.len;
+ } else {
+ convert_to_long(len);
+ l = len->value.lval;
+ }
+
+ /* if "from" position is negative, count start position from the end
+ * of the string
+ */
+ if (f < 0) {
+ f = string->value.str.len + f;
+ if (f < 0) {
+ f = 0;
+ }
+ }
+
+ /* if "length" position is negative, set it to the length
+ * needed to stop that many chars from the end of the string
+ */
+ if (l < 0) {
+ l = (string->value.str.len - f) + l;
+ if (l < 0) {
+ l = 0;
+ }
+ }
+
+ if (f >= (int)string->value.str.len) {
+ RETURN_FALSE;
+ }
+
+ if ((f + l) < (int)string->value.str.len) {
+ string->value.str.val[f + l] = '\0';
+ }
+ RETVAL_STRING(string->value.str.val + f,1);
+}
+/* }}} */
+
+/* {{{ proto string quotemeta(string str)
+ Quote meta characters */
+void php3_quotemeta(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ char *str, *old;
+ char *p, *q;
+ char c;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ old = arg->value.str.val;
+
+ if (!*old) {
+ RETURN_FALSE;
+ }
+
+ str = emalloc(2 * arg->value.str.len + 1);
+
+ for(p = old, q = str; (c = *p); p++) {
+ switch(c) {
+ case '.':
+ case '\\':
+ case '+':
+ case '*':
+ case '?':
+ case '[':
+ case '^':
+ case ']':
+ case '$':
+ case '(':
+ case ')':
+ *q++ = '\\';
+ /* break is missing _intentionally_ */
+ default:
+ *q++ = c;
+ }
+ }
+ *q = 0;
+ RETVAL_STRING(erealloc(str, q - str + 1), 0);
+}
+/* }}} */
+
+/* {{{ proto int ord(string character)
+ Return ASCII value of character */
+void php3_ord(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+ RETVAL_LONG((unsigned char)str->value.str.val[0]);
+}
+/* }}} */
+
+/* {{{ proto string chr(int ascii)
+ Convert ASCII code to a character */
+void php3_chr(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *num;
+ char temp[2];
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &num) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(num);
+ temp[0] = (char) num->value.lval;
+ temp[1] = '\0';
+ RETVAL_STRINGL(temp, 1,1);
+}
+/* }}} */
+
+/* {{{ proto string(string str)
+ Make a string's first character uppercase */
+void php3_ucfirst(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ if (!*arg->value.str.val) {
+ RETURN_FALSE;
+ }
+ *arg->value.str.val = toupper((unsigned char)*arg->value.str.val);
+ RETVAL_STRING(arg->value.str.val,1);
+}
+/* }}} */
+
+/* {{{ proto string ucwords(string str)
+ Uppercase the first character of every word in a string */
+void php3_ucwords(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ char *r;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ if (!*arg->value.str.val) {
+ RETURN_FALSE;
+ }
+ *arg->value.str.val = toupper((unsigned char)*arg->value.str.val);
+ r=arg->value.str.val;
+ while((r=strstr(r," "))){
+ if(*(r+1)){
+ r++;
+ *r=toupper((unsigned char)*r);
+ }
+ }
+ RETVAL_STRING(arg->value.str.val,1);
+}
+/* }}} */
+
+/* {{{ proto string strtr(string str, string from, string to)
+ Translate characters in str using given translation tables */
+void php3_strtr(INTERNAL_FUNCTION_PARAMETERS)
+{ /* strtr(STRING,FROM,TO) */
+ pval *str, *from, *to;
+ unsigned char xlat[256];
+ unsigned char *str_from, *str_to, *string;
+ int i, len1, len2;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &str, &from, &to) ==
+ FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+ convert_to_string(from);
+ convert_to_string(to);
+
+ string = (unsigned char*) str->value.str.val;
+ str_from = (unsigned char*) from->value.str.val;
+ str_to = (unsigned char*) to->value.str.val;
+
+ len1 = from->value.str.len;
+ len2 = to->value.str.len;
+
+ if (len1 > len2) {
+ str_from[len2] = '\0';
+ len1 = len2;
+ }
+ for (i = 0; i < 256; xlat[i] = i, i++);
+
+ for (i = 0; i < len1; i++) {
+ xlat[(unsigned char) str_from[i]] = str_to[i];
+ }
+
+ for (i = 0; i < str->value.str.len; i++) {
+ string[i] = xlat[(unsigned char) string[i]];
+ }
+
+ RETVAL_STRING((char *)string,1);
+}
+/* }}} */
+
+
+/* {{{ proto string strrev(string str)
+ Reverse a string */
+void php3_strrev(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str;
+ int i,len;
+ char c;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &str)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(str);
+
+ len = str->value.str.len;
+
+ for (i=0; i<len-1-i; i++) {
+ c=str->value.str.val[i];
+ str->value.str.val[i] = str->value.str.val[len-1-i];
+ str->value.str.val[len-1-i]=c;
+ }
+
+ *return_value = *str;
+ pval_copy_constructor(return_value);
+}
+/* }}} */
+
+
+/* be careful, this edits the string in-place */
+PHPAPI void _php3_stripslashes(char *string, int *len)
+{
+ char *s, *t;
+ int l;
+ char escape_char='\\';
+ PLS_FETCH();
+
+ if (PG(magic_quotes_sybase)) {
+ escape_char='\'';
+ }
+
+ if (len != NULL) {
+ l = *len;
+ } else {
+ l = strlen(string);
+ }
+ s = string;
+ t = string;
+ while (l > 0) {
+ if (*t == escape_char) {
+ t++; /* skip the slash */
+ if (len != NULL)
+ (*len)--;
+ l--;
+ if (l > 0) {
+ if(*t=='0') {
+ *s++='\0';
+ t++;
+ } else {
+ *s++ = *t++; /* preserve the next character */
+ }
+ l--;
+ }
+ } else {
+ if (s != t)
+ *s++ = *t++;
+ else {
+ s++;
+ t++;
+ }
+ l--;
+ }
+ }
+ if (s != t) {
+ *s = '\0';
+ }
+}
+
+/* {{{ proto string addslashes(string str)
+ Escape single quote, double quotes and backslash characters in a string with backslashes */
+void php3_addslashes(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+ return_value->value.str.val = _php3_addslashes(str->value.str.val,str->value.str.len,&return_value->value.str.len,0);
+ return_value->type = IS_STRING;
+}
+/* }}} */
+
+/* {{{ proto string stripslashes(string str)
+ Strip backslashes from a string */
+void php3_stripslashes(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &str) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(str);
+
+ /* let RETVAL do the estrdup() */
+ RETVAL_STRING(str->value.str.val,1);
+ _php3_stripslashes(return_value->value.str.val,&return_value->value.str.len);
+}
+/* }}} */
+
+#ifndef HAVE_STRERROR
+#if !APACHE
+char *strerror(int errnum)
+{
+ extern int sys_nerr;
+ extern char *sys_errlist[];
+#ifndef THREAD_SAFE
+ static char str_ebuf[40];
+#endif
+
+ if ((unsigned int)errnum < sys_nerr) return(sys_errlist[errnum]);
+ (void)sprintf(STATIC(str_ebuf), "Unknown error: %d", errnum);
+ return(STATIC(str_ebuf));
+}
+#endif
+#endif
+
+
+PHPAPI char *_php3_addslashes(char *str, int length, int *new_length, int should_free)
+{
+ /* maximum string length, worst case situation */
+ char *new_str = (char *) emalloc((length?length:strlen(str))*2+1);
+ char *source,*target;
+ char *end;
+ char c;
+ PLS_FETCH();
+
+ for (source=str,end=source+length,target=new_str; (c = *source) || source<end; source++) {
+ switch(c) {
+ case '\0':
+ *target++ = '\\';
+ *target++ = '0';
+ break;
+ case '\'':
+ if (PG(magic_quotes_sybase)) {
+ *target++ = '\'';
+ *target++ = '\'';
+ break;
+ }
+ /* break is missing *intentionally* */
+ case '\"':
+ case '\\':
+ if (!PG(magic_quotes_sybase)) {
+ *target++ = '\\';
+ }
+ /* break is missing *intentionally* */
+ default:
+ *target++ = c;
+ break;
+ }
+ }
+ *target = 0;
+ if(new_length) *new_length = target - new_str;
+ if (should_free) {
+ STR_FREE(str);
+ }
+ return new_str;
+}
+
+
+#define _HEB_BLOCK_TYPE_ENG 1
+#define _HEB_BLOCK_TYPE_HEB 2
+#define isheb(c) (((((unsigned char) c)>=224) && (((unsigned char) c)<=250)) ? 1 : 0)
+#define _isblank(c) (((((unsigned char) c)==' ' || ((unsigned char) c)=='\t')) ? 1 : 0)
+#define _isnewline(c) (((((unsigned char) c)=='\n' || ((unsigned char) c)=='\r')) ? 1 : 0)
+
+static void _php3_char_to_str(char *str,uint len,char from,char *to,int to_len,pval *result)
+{
+ int char_count=0;
+ char *source,*target,*tmp,*source_end=str+len, *tmp_end=NULL;
+
+ for (source=str; source<source_end; source++) {
+ if (*source==from) {
+ char_count++;
+ }
+ }
+
+ result->type = IS_STRING;
+
+ if (char_count==0) {
+ result->value.str.val = estrndup(str,len);
+ result->value.str.len = len;
+ return;
+ }
+
+ result->value.str.len = len+char_count*(to_len-1);
+ result->value.str.val = target = (char *) emalloc(result->value.str.len+1);
+
+ for (source=str; source<source_end; source++) {
+ if (*source==from) {
+ for (tmp=to,tmp_end=tmp+to_len; tmp<tmp_end; tmp++) {
+ *target = *tmp;
+ target++;
+ }
+ } else {
+ *target = *source;
+ target++;
+ }
+ }
+ *target = 0;
+}
+
+/*
+ * this is a binary safe equivalent to strnstr
+ * note that we don't check for the end in str_to_str but here
+ */
+
+static inline char *
+_php3_memnstr(char *haystack, char *needle, int needle_len, char *end)
+{
+ char *p = haystack;
+ char *s = NULL;
+
+ for(; p < end - needle_len + 1&&
+ (s = memchr(p, *needle, end - haystack)); p = s + 1) {
+ if(memcmp(s, needle, needle_len) == 0)
+ return s;
+ }
+ return NULL;
+}
+
+/*
+ * because of efficiency we use malloc/realloc/free here
+ * erealloc _will_ move your data around - it took me some time
+ * to find out ... Sascha Schumann <sas@schell.de> 981220
+ */
+
+static char *_php3_str_to_str(char *haystack, int length,
+ char *needle, int needle_len, char *str, int str_len, int *_new_length)
+{
+ char *p, *q;
+ char *r, *s;
+ char *end = haystack + length;
+ char *new;
+
+ new = malloc(length);
+ /* we jump through haystack searching for the needle. hurray! */
+ for(p = haystack, q = new;
+ (r = _php3_memnstr(p, needle, needle_len, end));) {
+ /* this ain't optimal. you could call it `efficient memory usage' */
+ realloc(new, (q - new) + (r - p) + (str_len) + 1);
+ memcpy(q, p, r - p);
+ q += r - p;
+ memcpy(q, str, str_len);
+ q += str_len;
+ p = r + needle_len;
+ }
+ /* if there is a rest, copy it */
+ if((end - p)) {
+ s = (q) + (end - p);
+ new = realloc(new, s - new + 1);
+ memcpy(q, p, end - p);
+ q = s;
+ }
+ *q = '\0';
+ if(_new_length) *_new_length = q - new;
+ return new;
+}
+
+/* {{{ proto string str_replace(string needle, string str, string haystack)
+ Replace all occurrences of needle in haystack with str */
+void php3_str_replace(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *haystack, *needle, *str;
+ char *new;
+
+ if(ARG_COUNT(ht) != 3 ||
+ getParameters(ht, 3, &needle, &str, &haystack) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(haystack);
+ convert_to_string(needle);
+ convert_to_string(str);
+
+ if(needle->value.str.len == 1) {
+ _php3_char_to_str(haystack->value.str.val,haystack->value.str.len,needle->value.str.val[0],str->value.str.val, str->value.str.len ,return_value);
+ return;
+ }
+
+ new = _php3_str_to_str(haystack->value.str.val, haystack->value.str.len,
+ needle->value.str.val, needle->value.str.len,
+ str->value.str.val, str->value.str.len,
+ &return_value->value.str.len);
+ return_value->value.str.val = emalloc(return_value->value.str.len + 1);
+ memcpy(return_value->value.str.val, new, return_value->value.str.len + 1);
+ free(new);
+ return_value->type = IS_STRING;
+}
+/* }}} */
+
+/* Converts Logical Hebrew text (Hebrew Windows style) to Visual text
+ * Cheers/complaints/flames - Zeev Suraski <zeev@php.net>
+ */
+static void _php3_hebrev(INTERNAL_FUNCTION_PARAMETERS,int convert_newlines)
+{
+ pval *str,*max_chars_per_line;
+ char *heb_str,*tmp,*target,*opposite_target,*broken_str;
+ int block_start, block_end, block_type, block_length, i;
+ int block_ended;
+ long max_chars=0;
+ int begin,end,char_count,orig_begin;
+
+
+ switch(ARG_COUNT(ht)) {
+ case 1:
+ if (getParameters(ht, 1, &str)==FAILURE) {
+ RETURN_FALSE;
+ }
+ break;
+ case 2:
+ if (getParameters(ht, 2, &str, &max_chars_per_line)==FAILURE) {
+ RETURN_FALSE;
+ }
+ convert_to_long(max_chars_per_line);
+ max_chars = max_chars_per_line->value.lval;
+ break;
+ default:
+ WRONG_PARAM_COUNT;
+ break;
+ }
+
+ convert_to_string(str);
+
+ if (str->value.str.len==0) {
+ RETURN_FALSE;
+ }
+
+ tmp = str->value.str.val;
+ block_start=block_end=0;
+ block_ended=0;
+
+ heb_str = (char *) emalloc(str->value.str.len+1);
+ target = heb_str+str->value.str.len;
+ opposite_target = heb_str;
+ *target = 0;
+ target--;
+
+ block_length=0;
+
+ if (isheb(*tmp)) {
+ block_type = _HEB_BLOCK_TYPE_HEB;
+ } else {
+ block_type = _HEB_BLOCK_TYPE_ENG;
+ }
+
+ do {
+ if (block_type==_HEB_BLOCK_TYPE_HEB) {
+ while((isheb((int)*(tmp+1)) || _isblank((int)*(tmp+1)) || ispunct((int)*(tmp+1)) || (int)*(tmp+1)=='\n' ) && block_end<str->value.str.len-1) {
+ tmp++;
+ block_end++;
+ block_length++;
+ }
+ for (i=block_start; i<=block_end; i++) {
+ *target = str->value.str.val[i];
+ switch (*target) {
+ case '(':
+ *target = ')';
+ break;
+ case ')':
+ *target = '(';
+ break;
+ default:
+ break;
+ }
+ target--;
+ }
+ block_type = _HEB_BLOCK_TYPE_ENG;
+ } else {
+ while(!isheb(*(tmp+1)) && (int)*(tmp+1)!='\n' && block_end<str->value.str.len-1) {
+ tmp++;
+ block_end++;
+ block_length++;
+ }
+ while ((_isblank((int)*tmp) || ispunct((int)*tmp)) && *tmp!='/' && *tmp!='-' && block_end>block_start) {
+ tmp--;
+ block_end--;
+ }
+ for (i=block_end; i>=block_start; i--) {
+ *target = str->value.str.val[i];
+ target--;
+ }
+ block_type = _HEB_BLOCK_TYPE_HEB;
+ }
+ block_start=block_end+1;
+ } while(block_end<str->value.str.len-1);
+
+
+ broken_str = (char *) emalloc(str->value.str.len+1);
+ begin=end=str->value.str.len-1;
+ target = broken_str;
+
+ while (1) {
+ char_count=0;
+ while ((!max_chars || char_count<max_chars) && begin>0) {
+ char_count++;
+ begin--;
+ if (begin<=0 || _isnewline(heb_str[begin])) {
+ while(begin>0 && _isnewline(heb_str[begin-1])) {
+ begin--;
+ char_count++;
+ }
+ break;
+ }
+ }
+ if (char_count==max_chars) { /* try to avoid breaking words */
+ int new_char_count=char_count, new_begin=begin;
+
+ while (new_char_count>0) {
+ if (_isblank(heb_str[new_begin]) || _isnewline(heb_str[new_begin])) {
+ break;
+ }
+ new_begin++;
+ new_char_count--;
+ }
+ if (new_char_count>0) {
+ char_count=new_char_count;
+ begin=new_begin;
+ }
+ }
+ orig_begin=begin;
+
+ if (_isblank(heb_str[begin])) {
+ heb_str[begin]='\n';
+ }
+ while (begin<=end && _isnewline(heb_str[begin])) { /* skip leading newlines */
+ begin++;
+ }
+ for (i=begin; i<=end; i++) { /* copy content */
+ *target = heb_str[i];
+ target++;
+ }
+ for (i=orig_begin; i<=end && _isnewline(heb_str[i]); i++) {
+ *target = heb_str[i];
+ target++;
+ }
+ begin=orig_begin;
+
+ if (begin<=0) {
+ *target = 0;
+ break;
+ }
+ begin--;
+ end=begin;
+ }
+ efree(heb_str);
+
+ if (convert_newlines) {
+ _php3_char_to_str(broken_str,str->value.str.len,'\n',"<br>\n",5,return_value);
+ efree(broken_str);
+ } else {
+ return_value->value.str.val = broken_str;
+ return_value->value.str.len = str->value.str.len;
+ return_value->type = IS_STRING;
+ }
+}
+
+
+/* {{{ proto string hebrev(string str [, int max_chars_per_line])
+ Convert logical Hebrew text to visual text */
+void php3_hebrev(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_hebrev(INTERNAL_FUNCTION_PARAM_PASSTHRU,0);
+}
+/* }}} */
+
+/* {{{ proto string hebrev(string str [, int max_chars_per_line])
+ Convert logical Hebrew text to visual text with newline conversion */
+void php3_hebrev_with_conversion(INTERNAL_FUNCTION_PARAMETERS)
+{
+ _php3_hebrev(INTERNAL_FUNCTION_PARAM_PASSTHRU,1);
+}
+/* }}} */
+
+/* {{{ proto string nl2br(string str)
+ Converts newlines to HTML line breaks */
+void php3_newline_to_br(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *str;
+
+ if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &str)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ convert_to_string(str);
+
+ _php3_char_to_str(str->value.str.val,str->value.str.len,'\n',"<br>\n",5,return_value);
+}
+/* }}} */
+
+/* {{{ proto string setlocale(string category, string locale)
+ Set locale information */
+void php3_setlocale(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *category, *locale;
+ int cat;
+ char *loc, *retval;
+
+ if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &category, &locale)==FAILURE)
+ WRONG_PARAM_COUNT;
+#if HAVE_SETLOCALE
+ convert_to_string(category);
+ convert_to_string(locale);
+ if (!strcasecmp ("LC_ALL", category->value.str.val))
+ cat = LC_ALL;
+ else if (!strcasecmp ("LC_COLLATE", category->value.str.val))
+ cat = LC_COLLATE;
+ else if (!strcasecmp ("LC_CTYPE", category->value.str.val))
+ cat = LC_CTYPE;
+ else if (!strcasecmp ("LC_MONETARY", category->value.str.val))
+ cat = LC_MONETARY;
+ else if (!strcasecmp ("LC_NUMERIC", category->value.str.val))
+ cat = LC_NUMERIC;
+ else if (!strcasecmp ("LC_TIME", category->value.str.val))
+ cat = LC_TIME;
+ else {
+ php3_error(E_WARNING,"Invalid locale category name %s, must be one of LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC or LC_TIME", category->value.str.val);
+ RETURN_FALSE;
+ }
+ if (!strcmp ("0", locale->value.str.val))
+ loc = NULL;
+ else
+ loc = locale->value.str.val;
+ retval = setlocale (cat, loc);
+ if (retval) {
+ RETVAL_STRING(retval,1);
+ return;
+ }
+#endif
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto void parsestr(string encoded_string)
+ Parses GET/POST/COOKIE data and sets global variables. */
+void php3_parsestr(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ char *res = NULL;
+
+ if (getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+ if (arg->value.str.val && *arg->value.str.val) {
+ res = estrndup(arg->value.str.val,arg->value.str.len);
+ }
+ php3_treat_data(PARSE_STRING, res);
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/syslog.c b/ext/standard/syslog.c
new file mode 100644
index 0000000000..4581ed58dc
--- /dev/null
+++ b/ext/standard/syslog.c
@@ -0,0 +1,296 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Stig Sæther Bakken <ssb@guardian.no> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+#include "php_ini.h"
+#include "zend_globals.h"
+
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if MSVC5
+#include "win32/syslog.h"
+#else
+#include <syslog.h>
+#endif
+
+#include <string.h>
+#include <errno.h>
+
+#include <stdio.h>
+#include "php3_syslog.h"
+
+static int syslog_started;
+static char *syslog_device;
+static void start_syslog(void);
+
+int php3_minit_syslog(INIT_FUNC_ARGS)
+{
+ TLS_VARS;
+
+ /* error levels */
+ REGISTER_LONG_CONSTANT("LOG_EMERG", LOG_EMERG, CONST_CS | CONST_PERSISTENT); /* system unusable */
+ REGISTER_LONG_CONSTANT("LOG_ALERT", LOG_ALERT, CONST_CS | CONST_PERSISTENT); /* immediate action required */
+ REGISTER_LONG_CONSTANT("LOG_CRIT", LOG_CRIT, CONST_CS | CONST_PERSISTENT); /* critical conditions */
+ REGISTER_LONG_CONSTANT("LOG_ERR", LOG_ERR, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_WARNING", LOG_WARNING, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_NOTICE", LOG_NOTICE, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_INFO", LOG_INFO, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_DEBUG", LOG_DEBUG, CONST_CS | CONST_PERSISTENT);
+ /* facility: type of program logging the message */
+ REGISTER_LONG_CONSTANT("LOG_KERN", LOG_KERN, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_USER", LOG_USER, CONST_CS | CONST_PERSISTENT); /* generic user level */
+ REGISTER_LONG_CONSTANT("LOG_MAIL", LOG_MAIL, CONST_CS | CONST_PERSISTENT); /* log to email */
+ REGISTER_LONG_CONSTANT("LOG_DAEMON", LOG_DAEMON, CONST_CS | CONST_PERSISTENT); /* other system daemons */
+ REGISTER_LONG_CONSTANT("LOG_AUTH", LOG_AUTH, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_SYSLOG", LOG_SYSLOG, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_LPR", LOG_LPR, CONST_CS | CONST_PERSISTENT);
+#ifdef LOG_NEWS
+ /* No LOG_NEWS on HP-UX */
+ REGISTER_LONG_CONSTANT("LOG_NEWS", LOG_NEWS, CONST_CS | CONST_PERSISTENT); /* usenet new */
+#endif
+#ifdef LOG_UUCP
+ /* No LOG_UUCP on HP-UX */
+ REGISTER_LONG_CONSTANT("LOG_UUCP", LOG_UUCP, CONST_CS | CONST_PERSISTENT);
+#endif
+#ifdef LOG_CRON
+ /* apparently some systems don't have this one */
+ REGISTER_LONG_CONSTANT("LOG_CRON", LOG_CRON, CONST_CS | CONST_PERSISTENT);
+#endif
+#ifdef LOG_AUTHPRIV
+ /* AIX doesn't have LOG_AUTHPRIV */
+ REGISTER_LONG_CONSTANT("LOG_AUTHPRIV", LOG_AUTHPRIV, CONST_CS | CONST_PERSISTENT);
+#endif
+#ifndef MSVC5
+ REGISTER_LONG_CONSTANT("LOG_LOCAL0", LOG_LOCAL0, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_LOCAL1", LOG_LOCAL1, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_LOCAL2", LOG_LOCAL2, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_LOCAL3", LOG_LOCAL3, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_LOCAL4", LOG_LOCAL4, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_LOCAL5", LOG_LOCAL5, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_LOCAL6", LOG_LOCAL6, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_LOCAL7", LOG_LOCAL7, CONST_CS | CONST_PERSISTENT);
+#endif
+ /* options */
+ REGISTER_LONG_CONSTANT("LOG_PID", LOG_PID, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_CONS", LOG_CONS, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_ODELAY", LOG_ODELAY, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_NDELAY", LOG_NDELAY, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("LOG_NOWAIT", LOG_NOWAIT, CONST_CS | CONST_PERSISTENT);
+#ifdef LOG_PERROR
+ /* AIX doesn't have LOG_PERROR */
+ REGISTER_LONG_CONSTANT("LOG_PERROR", LOG_PERROR, CONST_CS | CONST_PERSISTENT); /*log to stderr*/
+#endif
+
+ return SUCCESS;
+}
+
+
+int php3_rinit_syslog(INIT_FUNC_ARGS)
+{
+ if (INI_INT("define_syslog_variables")) {
+ start_syslog();
+ } else {
+ syslog_started=0;
+ }
+ syslog_device=NULL;
+ return SUCCESS;
+}
+
+
+int php3_rshutdown_syslog(SHUTDOWN_FUNC_ARGS)
+{
+ if (syslog_device) {
+ efree(syslog_device);
+ }
+ return SUCCESS;
+}
+
+
+static void start_syslog(void)
+{
+ ELS_FETCH();
+
+ /* error levels */
+ SET_VAR_LONG("LOG_EMERG", LOG_EMERG); /* system unusable */
+ SET_VAR_LONG("LOG_ALERT", LOG_ALERT); /* immediate action required */
+ SET_VAR_LONG("LOG_CRIT", LOG_CRIT); /* critical conditions */
+ SET_VAR_LONG("LOG_ERR", LOG_ERR);
+ SET_VAR_LONG("LOG_WARNING", LOG_WARNING);
+ SET_VAR_LONG("LOG_NOTICE", LOG_NOTICE);
+ SET_VAR_LONG("LOG_INFO", LOG_INFO);
+ SET_VAR_LONG("LOG_DEBUG", LOG_DEBUG);
+ /* facility: type of program logging the message */
+ SET_VAR_LONG("LOG_KERN", LOG_KERN);
+ SET_VAR_LONG("LOG_USER", LOG_USER); /* generic user level */
+ SET_VAR_LONG("LOG_MAIL", LOG_MAIL); /* log to email */
+ SET_VAR_LONG("LOG_DAEMON", LOG_DAEMON); /* other system daemons */
+ SET_VAR_LONG("LOG_AUTH", LOG_AUTH);
+ SET_VAR_LONG("LOG_SYSLOG", LOG_SYSLOG);
+ SET_VAR_LONG("LOG_LPR", LOG_LPR);
+#ifdef LOG_NEWS
+ /* No LOG_NEWS on HP-UX */
+ SET_VAR_LONG("LOG_NEWS", LOG_NEWS); /* usenet new */
+#endif
+#ifdef LOG_UUCP
+ /* No LOG_UUCP on HP-UX */
+ SET_VAR_LONG("LOG_UUCP", LOG_UUCP);
+#endif
+#ifdef LOG_CRON
+ /* apparently some systems don't have this one */
+ SET_VAR_LONG("LOG_CRON", LOG_CRON);
+#endif
+#ifdef LOG_AUTHPRIV
+ /* AIX doesn't have LOG_AUTHPRIV */
+ SET_VAR_LONG("LOG_AUTHPRIV", LOG_AUTHPRIV);
+#endif
+#ifndef MSVC5
+ SET_VAR_LONG("LOG_LOCAL0", LOG_LOCAL0);
+ SET_VAR_LONG("LOG_LOCAL1", LOG_LOCAL1);
+ SET_VAR_LONG("LOG_LOCAL2", LOG_LOCAL2);
+ SET_VAR_LONG("LOG_LOCAL3", LOG_LOCAL3);
+ SET_VAR_LONG("LOG_LOCAL4", LOG_LOCAL4);
+ SET_VAR_LONG("LOG_LOCAL5", LOG_LOCAL5);
+ SET_VAR_LONG("LOG_LOCAL6", LOG_LOCAL6);
+ SET_VAR_LONG("LOG_LOCAL7", LOG_LOCAL7);
+#endif
+ /* options */
+ SET_VAR_LONG("LOG_PID", LOG_PID);
+ SET_VAR_LONG("LOG_CONS", LOG_CONS);
+ SET_VAR_LONG("LOG_ODELAY", LOG_ODELAY);
+ SET_VAR_LONG("LOG_NDELAY", LOG_NDELAY);
+ SET_VAR_LONG("LOG_NOWAIT", LOG_NOWAIT);
+#ifdef LOG_PERROR
+ /* AIX doesn't have LOG_PERROR */
+ SET_VAR_LONG("LOG_PERROR", LOG_PERROR); /*log to stderr*/
+#endif
+
+ syslog_started=1;
+}
+
+/* {{{ proto void define_syslog_variables(void)
+ Initializes all syslog-related variables */
+void php3_define_syslog_variables(INTERNAL_FUNCTION_PARAMETERS)
+{
+ if (!syslog_started) {
+ start_syslog();
+ }
+}
+
+/* {{{ proto int openlog(string ident, int option, int facility)
+ Open connection to system logger */
+/*
+ ** OpenLog("nettopp", $LOG_PID, $LOG_LOCAL1);
+ ** Syslog($LOG_EMERG, "help me!")
+ ** CloseLog();
+ */
+void php3_openlog(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *ident, *option, *facility;
+ if (ARG_COUNT(ht) != 3 || getParameters(ht, 3, &ident, &option, &facility) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(ident);
+ convert_to_long(option);
+ convert_to_long(facility);
+ if (syslog_device) {
+ efree(syslog_device);
+ }
+ syslog_device = estrndup(ident->value.str.val,ident->value.str.len);
+ openlog(syslog_device, option->value.lval, facility->value.lval);
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int closelog(void)
+ Close connection to system logger */
+void php3_closelog(INTERNAL_FUNCTION_PARAMETERS)
+{
+ closelog();
+ if (syslog_device) {
+ efree(syslog_device);
+ syslog_device=NULL;
+ }
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto int syslog(int priority, string message)
+ Generate a system log message */
+void php3_syslog(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *priority, *message;
+
+ if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &priority, &message) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long(priority);
+ convert_to_string(message);
+
+ /*
+ * CAVEAT: if the message contains patterns such as "%s",
+ * this will cause problems.
+ */
+
+ syslog(priority->value.lval, message->value.str.val);
+ RETURN_TRUE;
+}
+/* }}} */
+
+
+function_entry syslog_functions[] = {
+ {"openlog", php3_openlog, NULL},
+ {"syslog", php3_syslog, NULL},
+ {"closelog", php3_closelog, NULL},
+ {"define_syslog_variables", php3_define_syslog_variables, NULL},
+ {NULL, NULL, NULL}
+};
+
+
+php3_module_entry syslog_module_entry = {
+ "Syslog", syslog_functions, php3_minit_syslog, NULL, php3_rinit_syslog, php3_rshutdown_syslog, NULL, STANDARD_MODULE_PROPERTIES
+};
+
+
+#if COMPILE_DL
+DLEXPORT php3_module_entry *get_module(void) { return &syslog_module_entry; }
+#endif
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/type.c b/ext/standard/type.c
new file mode 100644
index 0000000000..f263ee8185
--- /dev/null
+++ b/ext/standard/type.c
@@ -0,0 +1,108 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf |
+ | |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+#include "php.h"
+#include "type.h"
+
+/*
+ * Determines if 'str' is an integer (long), real number or a string
+ *
+ * Note that leading zeroes automatically force a STRING type
+ */
+int php3_check_type(char *str)
+{
+ char *s;
+ int type = IS_LONG;
+
+ s = str;
+ if (*s == '0' && *(s + 1) && *(s + 1) != '.')
+ return (IS_STRING);
+ if (*s == '+' || *s == '-' || (*s >= '0' && *s <= '9') || *s == '.') {
+ if (*s == '.')
+ type = IS_DOUBLE;
+ s++;
+ while (*s) {
+ if (*s >= '0' && *s <= '9') {
+ s++;
+ continue;
+ } else if (*s == '.' && type == IS_LONG) {
+ type = IS_DOUBLE;
+ s++;
+ continue;
+ } else
+ return (IS_STRING);
+ }
+ } else
+ return (IS_STRING);
+
+ return (type);
+} /* php3_check_type */
+
+/*
+ * 0 - simple variable
+ * 1 - non-index array
+ * 2 - index array
+ */
+int php3_check_ident_type(char *str)
+{
+ char *s;
+
+ if (!(s = (char *) strchr(str, '[')))
+ return (GPC_REGULAR);
+ s++;
+ while (*s == ' ' || *s == '\t' || *s == '\n') {
+ s++;
+ }
+ if (*s == ']') {
+ return (GPC_NON_INDEXED_ARRAY);
+ }
+ return (GPC_INDEXED_ARRAY);
+}
+
+char *php3_get_ident_index(char *str)
+{
+ char *temp;
+ char *s, *t;
+ char o;
+
+ temp = emalloc(strlen(str));
+ temp[0] = '\0';
+ s = (char *) strchr(str, '[');
+ if (s) {
+ t = (char *) strrchr(str, ']');
+ if (t) {
+ o = *t;
+ *t = '\0';
+ strcpy(temp, s + 1);
+ *t = o;
+ }
+ }
+ return (temp);
+}
diff --git a/ext/standard/type.h b/ext/standard/type.h
new file mode 100644
index 0000000000..62f98bea7a
--- /dev/null
+++ b/ext/standard/type.h
@@ -0,0 +1,41 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
+ +----------------------------------------------------------------------+
+ */
+#ifndef _TYPE_H
+#define _TYPE_H
+
+extern int php3_check_type(char *str);
+extern int php3_check_ident_type(char *str);
+extern char *php3_get_ident_index(char *str);
+
+#define GPC_REGULAR 0x1
+#define GPC_INDEXED_ARRAY 0x2
+#define GPC_NON_INDEXED_ARRAY 0x4
+#define GPC_ARRAY (GPC_INDEXED_ARRAY | GPC_NON_INDEXED_ARRAY)
+
+#endif
diff --git a/ext/standard/uniqid.c b/ext/standard/uniqid.c
new file mode 100644
index 0000000000..89988b3eca
--- /dev/null
+++ b/ext/standard/uniqid.c
@@ -0,0 +1,103 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Author: Stig Sæther Bakken <ssb@guardian.no> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <string.h>
+#include <errno.h>
+
+#include <stdio.h>
+#if MSVC5
+#include "win32/time.h"
+#else
+#include <sys/time.h>
+#endif
+
+#include "uniqid.h"
+
+/* {{{ proto string uniqid(string prefix)
+ Generate a unique id */
+void php3_uniqid(INTERNAL_FUNCTION_PARAMETERS)
+{
+#ifdef HAVE_GETTIMEOFDAY
+ pval *prefix;
+
+ char uniqid[128];
+ int sec, usec;
+ struct timeval tv;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht,1,&prefix)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(prefix);
+
+ /* Do some bounds checking since we are using a char array. */
+ if (strlen(prefix->value.str.val) > 114) {
+ php3_error(E_WARNING, "The prefix to uniqid should not be more than 114 characters.");
+ return;
+ }
+ /* dont need this on windows so lets not do it*/
+#if HAVE_USLEEP && !(WIN32|WINNT)
+ usleep(1);
+#endif
+ gettimeofday((struct timeval *) &tv, (struct timezone *) NULL);
+ sec = (int) tv.tv_sec;
+ usec = (int) (tv.tv_usec % 1000000);
+
+ /* The max value usec can have is 0xF423F, so we use only five hex
+ * digits for usecs:
+ */
+ sprintf(uniqid, "%s%08x%05x", prefix->value.str.val, sec, usec);
+
+ RETURN_STRING(uniqid,1);
+#endif
+}
+/* }}} */
+
+function_entry uniqid_functions[] = {
+ {"uniqid", php3_uniqid, NULL},
+ {NULL, NULL, NULL}
+};
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/uniqid.h b/ext/standard/uniqid.h
new file mode 100644
index 0000000000..b241c35514
--- /dev/null
+++ b/ext/standard/uniqid.h
@@ -0,0 +1,37 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Author: Stig Sæther Bakken <ssb@guardian.no> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#ifndef _UNIQID_H
+#define _UNIQID_H
+
+extern void php3_uniqid(INTERNAL_FUNCTION_PARAMETERS);
+
+#endif /* _UNIQID_H */
diff --git a/ext/standard/url.c b/ext/standard/url.c
new file mode 100644
index 0000000000..df6e6171f6
--- /dev/null
+++ b/ext/standard/url.c
@@ -0,0 +1,439 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Author: Jim Winstead (jimw@php.net) |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/types.h>
+
+/* php.h includes the correct regex.h */
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include "php.h"
+
+#include "url.h"
+#ifdef _OSD_POSIX
+#ifndef APACHE
+#error On this EBCDIC platform, PHP3 is only supported as an Apache module.
+#else /*APACHE*/
+#ifndef CHARSET_EBCDIC
+#define CHARSET_EBCDIC /* this machine uses EBCDIC, not ASCII! */
+#endif
+#include "ebcdic.h"
+#endif /*APACHE*/
+#endif /*_OSD_POSIX*/
+
+
+void free_url(url * theurl)
+{
+ if (theurl->scheme)
+ efree(theurl->scheme);
+ if (theurl->user)
+ efree(theurl->user);
+ if (theurl->pass)
+ efree(theurl->pass);
+ if (theurl->host)
+ efree(theurl->host);
+ if (theurl->path)
+ efree(theurl->path);
+ if (theurl->query)
+ efree(theurl->query);
+ if (theurl->fragment)
+ efree(theurl->fragment);
+ efree(theurl);
+}
+
+url *url_parse(char *string)
+{
+ regex_t re;
+ regmatch_t subs[10];
+ int err;
+ int length = strlen(string);
+ char *result;
+
+ url *ret = (url *) emalloc(sizeof(url));
+ if (!ret) {
+ /*php3_error(E_WARNING,"Unable to allocate memory\n");*/
+ return NULL;
+ }
+ memset(ret, 0, sizeof(url));
+
+ /* from Appendix B of draft-fielding-url-syntax-09,
+ http://www.ics.uci.edu/~fielding/url/url.txt */
+ err = regcomp(&re, "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?", REG_EXTENDED);
+ if (err) {
+ /*php3_error(E_WARNING,"Unable to compile regex: %d\n", err);*/
+ efree(ret);
+ return NULL;
+ }
+ err = regexec(&re, string, 10, subs, 0);
+ if (err) {
+ /*php3_error(E_WARNING,"Error with regex\n");*/
+ efree(ret);
+ return NULL;
+ }
+ /* no processing necessary on the scheme */
+ if (subs[2].rm_so != -1 && subs[2].rm_so < length) {
+ ret->scheme = estrndup(string + subs[2].rm_so, subs[2].rm_eo - subs[2].rm_so);
+ }
+
+ /* the path to the resource */
+ if (subs[5].rm_so != -1 && subs[5].rm_so < length) {
+ ret->path = estrndup(string + subs[5].rm_so, subs[5].rm_eo - subs[5].rm_so);
+ }
+
+ /* the query part */
+ if (subs[7].rm_so != -1 && subs[7].rm_so < length) {
+ ret->query = estrndup(string + subs[7].rm_so, subs[7].rm_eo - subs[7].rm_so);
+ }
+
+ /* the fragment */
+ if (subs[9].rm_so != -1 && subs[9].rm_so < length) {
+ ret->fragment = estrndup(string + subs[9].rm_so, subs[9].rm_eo - subs[9].rm_so);
+ }
+
+ /* extract the username, pass, and port from the hostname */
+ if (subs[4].rm_so != -1 && subs[4].rm_so < length) {
+ /* extract username:pass@host:port from regex results */
+ result = estrndup(string + subs[4].rm_so, subs[4].rm_eo - subs[4].rm_so);
+ length = strlen(result);
+
+ regfree(&re); /* free the old regex */
+
+ if ((err=regcomp(&re, "^(([^@:]+)(:([^@:]+))?@)?([^:@]+)(:([^:@]+))?", REG_EXTENDED))
+ || (err=regexec(&re, result, 10, subs, 0))) {
+ STR_FREE(ret->scheme);
+ STR_FREE(ret->path);
+ STR_FREE(ret->query);
+ STR_FREE(ret->fragment);
+ efree(ret);
+ efree(result);
+ /*php3_error(E_WARNING,"Unable to compile regex: %d\n", err);*/
+ return NULL;
+ }
+ /* now deal with all of the results */
+ if (subs[2].rm_so != -1 && subs[2].rm_so < length) {
+ ret->user = estrndup(result + subs[2].rm_so, subs[2].rm_eo - subs[2].rm_so);
+ }
+ if (subs[4].rm_so != -1 && subs[4].rm_so < length) {
+ ret->pass = estrndup(result + subs[4].rm_so, subs[4].rm_eo - subs[4].rm_so);
+ }
+ if (subs[5].rm_so != -1 && subs[5].rm_so < length) {
+ ret->host = estrndup(result + subs[5].rm_so, subs[5].rm_eo - subs[5].rm_so);
+ }
+ if (subs[7].rm_so != -1 && subs[7].rm_so < length) {
+ ret->port = (unsigned short) strtol(result + subs[7].rm_so, NULL, 10);
+ }
+ efree(result);
+ }
+ regfree(&re);
+ return ret;
+}
+
+/* {{{ proto array parse_url(string url)
+ Parse a URL and return its components */
+void php3_parse_url(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *string;
+ url *resource;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &string) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(string);
+
+ resource = url_parse(string->value.str.val);
+
+ if (resource == NULL) {
+ php3_error(E_WARNING, "unable to parse url (%s)", string->value.str.val);
+ RETURN_FALSE;
+ }
+ /* allocate an array for return */
+ if (array_init(return_value) == FAILURE) {
+ free_url(resource);
+ RETURN_FALSE;
+ }
+ /* add the various elements to the array */
+ if (resource->scheme != NULL)
+ add_assoc_string(return_value, "scheme", resource->scheme, 1);
+ if (resource->host != NULL)
+ add_assoc_string(return_value, "host", resource->host, 1);
+ if (resource->port != 0)
+ add_assoc_long(return_value, "port", resource->port);
+ if (resource->user != NULL)
+ add_assoc_string(return_value, "user", resource->user, 1);
+ if (resource->pass != NULL)
+ add_assoc_string(return_value, "pass", resource->pass, 1);
+ if (resource->path != NULL)
+ add_assoc_string(return_value, "path", resource->path, 1);
+ if (resource->query != NULL)
+ add_assoc_string(return_value, "query", resource->query, 1);
+ if (resource->fragment != NULL)
+ add_assoc_string(return_value, "fragment", resource->fragment, 1);
+ free_url(resource);
+}
+/* }}} */
+
+static int php3_htoi(char *s)
+{
+ int value;
+ int c;
+
+ c = s[0];
+ if (isupper(c))
+ c = tolower(c);
+ value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;
+
+ c = s[1];
+ if (isupper(c))
+ c = tolower(c);
+ value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;
+
+ return (value);
+}
+
+/* rfc1738:
+
+ ...The characters ";",
+ "/", "?", ":", "@", "=" and "&" are the characters which may be
+ reserved for special meaning within a scheme...
+
+ ...Thus, only alphanumerics, the special characters "$-_.+!*'(),", and
+ reserved characters used for their reserved purposes may be used
+ unencoded within a URL...
+
+ For added safety, we only leave -_. unencoded.
+ */
+
+static unsigned char hexchars[] = "0123456789ABCDEF";
+
+char *_php3_urlencode(char *s, int len)
+{
+ register int x, y;
+ unsigned char *str;
+
+ str = (unsigned char *) emalloc(3 * strlen(s) + 1);
+ for (x = 0, y = 0; len--; x++, y++) {
+ str[y] = (unsigned char) s[x];
+ if (str[y] == ' ') {
+ str[y] = '+';
+#ifndef CHARSET_EBCDIC
+ } else if ((str[y] < '0' && str[y] != '-' && str[y] != '.') ||
+ (str[y] < 'A' && str[y] > '9') ||
+ (str[y] > 'Z' && str[y] < 'a' && str[y] != '_') ||
+ (str[y] > 'z')) {
+ str[y++] = '%';
+ str[y++] = hexchars[(unsigned char) s[x] >> 4];
+ str[y] = hexchars[(unsigned char) s[x] & 15];
+ }
+#else /*CHARSET_EBCDIC*/
+ } else if (!isalnum(str[y]) && strchr("_-.", str[y]) != NULL) {
+ str[y++] = '%';
+ str[y++] = hexchars[os_toascii[(unsigned char) s[x]] >> 4];
+ str[y] = hexchars[os_toascii[(unsigned char) s[x]] & 0x0F];
+ }
+#endif /*CHARSET_EBCDIC*/
+ }
+ str[y] = '\0';
+ return ((char *) str);
+}
+
+/* {{{ proto string urlencode(string str)
+ URL-encodes string */
+void php3_urlencode(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ char *str;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ if (!arg->value.str.len) {
+ RETURN_FALSE;
+ }
+ str = _php3_urlencode(arg->value.str.val, arg->value.str.len);
+ RETVAL_STRING(str, 1);
+ efree(str);
+}
+/* }}} */
+
+/* {{{ proto string urldecode(string str)
+ Decodes URL-encoded string */
+void php3_urldecode(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ int len;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ if (!arg->value.str.len) {
+ RETURN_FALSE;
+ }
+ len = _php3_urldecode(arg->value.str.val, arg->value.str.len);
+
+ RETVAL_STRINGL(arg->value.str.val, len, 1);
+}
+/* }}} */
+
+int _php3_urldecode(char *str, int len)
+{
+ char *dest = str;
+ char *data = str;
+
+ while (len--) {
+ if (*data == '+')
+ *dest = ' ';
+ else if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1)) && isxdigit((int) *(data + 2))) {
+#ifndef CHARSET_EBCDIC
+ *dest = (char) php3_htoi(data + 1);
+#else
+ *dest = os_toebcdic[(char) php3_htoi(data + 1)];
+#endif
+ data += 2;
+ len -= 2;
+ } else
+ *dest = *data;
+ data++;
+ dest++;
+ }
+ *dest = '\0';
+ return dest - str;
+}
+
+char *_php3_rawurlencode(char *s, int len)
+{
+ register int x, y;
+ unsigned char *str;
+
+ str = (unsigned char *) emalloc(3 * len + 1);
+ for (x = 0, y = 0; len--; x++, y++) {
+ str[y] = (unsigned char) s[x];
+#ifndef CHARSET_EBCDIC
+ if ((str[y] < '0' && str[y] != '-' && str[y] != '.') ||
+ (str[y] < 'A' && str[y] > '9') ||
+ (str[y] > 'Z' && str[y] < 'a' && str[y] != '_') ||
+ (str[y] > 'z')) {
+ str[y++] = '%';
+ str[y++] = hexchars[(unsigned char) s[x] >> 4];
+ str[y] = hexchars[(unsigned char) s[x] & 15];
+#else /*CHARSET_EBCDIC*/
+ if (!isalnum(str[y]) && strchr("_-.", str[y]) != NULL) {
+ str[y++] = '%';
+ str[y++] = hexchars[os_toascii[(unsigned char) s[x]] >> 4];
+ str[y] = hexchars[os_toascii[(unsigned char) s[x]] & 15];
+#endif /*CHARSET_EBCDIC*/
+ }
+ }
+ str[y] = '\0';
+ return ((char *) str);
+}
+
+/* {{{ proto string rawurlencode(string str)
+ URL-encodes string */
+void php3_rawurlencode(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ char *str;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ if (!arg->value.str.len) {
+ RETURN_FALSE;
+ }
+ str = _php3_rawurlencode(arg->value.str.val, arg->value.str.len);
+ RETVAL_STRING(str, 1);
+ efree(str);
+}
+/* }}} */
+
+/* {{{ proto string rawurldecode(string str)
+ Decodes URL-encodes string */
+void php3_rawurldecode(INTERNAL_FUNCTION_PARAMETERS)
+{
+ pval *arg;
+ int len;
+ TLS_VARS;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &arg) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_string(arg);
+
+ if (!arg->value.str.len) {
+ RETURN_FALSE;
+ }
+ len = _php3_rawurldecode(arg->value.str.val, arg->value.str.len);
+
+ RETVAL_STRINGL(arg->value.str.val, len, 1);
+}
+/* }}} */
+
+int _php3_rawurldecode(char *str, int len)
+{
+ char *dest = str;
+ char *data = str;
+
+ while (len--) {
+ if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1)) && isxdigit((int) *(data + 2))) {
+#ifndef CHARSET_EBCDIC
+ *dest = (char) php3_htoi(data + 1);
+#else
+ *dest = os_toebcdic[(char) php3_htoi(data + 1)];
+#endif
+ data += 2;
+ len -= 2;
+ } else
+ *dest = *data;
+ data++;
+ dest++;
+ }
+ *dest = '\0';
+ return dest - str;
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/url.h b/ext/standard/url.h
new file mode 100644
index 0000000000..22d6e4a984
--- /dev/null
+++ b/ext/standard/url.h
@@ -0,0 +1,60 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Jim Winstead (jimw@php.net) |
+ +----------------------------------------------------------------------+
+ */
+/* $Id$ */
+
+typedef struct url {
+ char *scheme;
+ char *user;
+ char *pass;
+ char *host;
+ unsigned short port;
+ char *path;
+ char *query;
+ char *fragment;
+} url;
+
+extern void free_url(url *);
+extern url *url_parse(char *);
+extern int _php3_urldecode(char *, int); /* return value: length of decoded string */
+extern char *_php3_urlencode(char *, int);
+extern int _php3_rawurldecode(char *, int); /* return value: length of decoded string */
+extern char *_php3_rawurlencode(char *, int);
+
+extern void php3_parse_url(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_urlencode(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_urldecode(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_rawurlencode(INTERNAL_FUNCTION_PARAMETERS);
+extern void php3_rawurldecode(INTERNAL_FUNCTION_PARAMETERS);
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/ext/standard/var.c b/ext/standard/var.c
new file mode 100644
index 0000000000..feb277c4c3
--- /dev/null
+++ b/ext/standard/var.c
@@ -0,0 +1,391 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Jani Lehtimäki <jkl@njet.net> |
+ +----------------------------------------------------------------------+
+ */
+
+#ifdef THREAD_SAFE
+#include "tls.h"
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "php.h"
+#include "fopen-wrappers.h"
+#include "reg.h"
+#include "post.h"
+#include "php3_string.h"
+#if HAVE_SETLOCALE
+#include <locale.h>
+#endif
+
+#include "php3_var.h"
+
+void php3api_var_dump(pval *struc, int level)
+{
+ ulong index;
+ char *key;
+ int i, c = 0;
+ pval *data;
+ char buf[512];
+
+ switch (struc->type) {
+ case IS_LONG:
+ i = sprintf(buf, "%*cint(%ld)\n", level, ' ', struc->value.lval);
+ PHPWRITE(&buf[1], i - 1);
+ break;
+
+ case IS_DOUBLE:
+ i = sprintf(buf, "%*cfloat(%g)\n", level, ' ', struc->value.dval);
+ PHPWRITE(&buf[1], i - 1);
+ break;
+
+ case IS_STRING:
+ i = sprintf(buf, "%*cstring(%d) \"", level, ' ', struc->value.str.len);
+ PHPWRITE(&buf[1], i - 1);
+ PHPWRITE(struc->value.str.val, struc->value.str.len);
+ strcpy(buf, "\"\n");
+ PHPWRITE(buf, strlen(buf));
+ break;
+
+ case IS_ARRAY:
+ i = sprintf(buf, "%*carray(%d) {\n", level, ' ', _php3_hash_num_elements(struc->value.ht));
+ PHPWRITE(&buf[1], i - 1);
+ goto head_done;
+
+ case IS_OBJECT:
+ i = sprintf(buf, "%*cobject(%d) {\n", level, ' ', _php3_hash_num_elements(struc->value.ht));
+ PHPWRITE(&buf[1], i - 1);
+ head_done:
+
+ _php3_hash_internal_pointer_reset(struc->value.ht);
+ for (;; _php3_hash_move_forward(struc->value.ht)) {
+ if ((i = _php3_hash_get_current_key(struc->value.ht, &key, &index)) == HASH_KEY_NON_EXISTANT)
+ break;
+ if (c > 0) {
+ strcpy(buf, "\n");
+ PHPWRITE(buf, strlen(buf));
+ }
+ c++;
+ if (_php3_hash_get_current_data(struc->value.ht, (void **) (&data)) != SUCCESS || !data || (data == struc))
+ continue;
+ switch (i) {
+ case HASH_KEY_IS_LONG:{
+ pval d;
+
+ d.type = IS_LONG;
+ d.value.lval = index;
+ php3api_var_dump(&d, level + 2);
+ }
+ break;
+
+ case HASH_KEY_IS_STRING:{
+ pval d;
+
+ d.type = IS_STRING;
+ d.value.str.val = key;
+ d.value.str.len = strlen(key);
+ php3api_var_dump(&d, level + 2);
+ efree(key);
+ }
+ break;
+ }
+ php3api_var_dump(data, level + 2);
+ }
+ i = sprintf(buf, "%*c}\n", level, ' ');
+ PHPWRITE(&buf[1], i - 1);
+ break;
+
+ default:
+ i = sprintf(buf, "%*ci:0\n", level, ' ');
+ PHPWRITE(&buf[1], i - 1);
+ }
+}
+
+
+PHP_FUNCTION(var_dump)
+{
+ pval *struc;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &struc) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ php3api_var_dump(struc, 1);
+}
+
+
+
+#define STR_CAT(P,S,I) {\
+ pval *__p = (P);\
+ ulong __i = __p->value.str.len;\
+ __p->value.str.len += (I);\
+ if (__p->value.str.val) {\
+ __p->value.str.val = (char *)erealloc(__p->value.str.val, __p->value.str.len + 1);\
+ } else {\
+ __p->value.str.val = emalloc(__p->value.str.len + 1);\
+ *__p->value.str.val = 0;\
+ }\
+ strcat(__p->value.str.val + __i, (S));\
+}
+
+
+void php3api_var_serialize(pval *buf, pval *struc)
+{
+ char s[256];
+ ulong slen;
+ int i, ch;
+
+ switch (struc->type) {
+ case IS_LONG:
+ slen = sprintf(s, "i:%ld;", struc->value.lval);
+ STR_CAT(buf, s, slen);
+ return;
+
+ case IS_DOUBLE:
+ slen = sprintf(s, "d:%g;", struc->value.dval);
+ STR_CAT(buf, s, slen);
+ return;
+
+ case IS_STRING:{
+ char *p;
+
+ i = buf->value.str.len;
+ slen = sprintf(s, "s:%d:\"", struc->value.str.len);
+ STR_CAT(buf, s, slen + struc->value.str.len + 2);
+ p = buf->value.str.val + i + slen;
+ if (struc->value.str.len > 0) {
+ memcpy(p, struc->value.str.val, struc->value.str.len);
+ p += struc->value.str.len;
+ }
+ *p++ = '\"';
+ *p++ = ';';
+ *p = 0;
+ }
+ return;
+
+ case IS_ARRAY:
+ ch = 'a';
+ goto got_array;
+
+ case IS_OBJECT:
+ ch = 'o';
+
+ got_array:
+ i = _php3_hash_num_elements(struc->value.ht);
+ slen = sprintf(s, "%c:%d:{", ch, i);
+ STR_CAT(buf, s, slen);
+ if (i > 0) {
+ char *key;
+ pval *data;
+ pval d;
+ ulong index;
+
+ _php3_hash_internal_pointer_reset(struc->value.ht);
+ for (;; _php3_hash_move_forward(struc->value.ht)) {
+ if ((i = _php3_hash_get_current_key(struc->value.ht, &key, &index)) == HASH_KEY_NON_EXISTANT) {
+ break;
+ }
+ if (_php3_hash_get_current_data(struc->value.ht, (void **) (&data)) != SUCCESS || !data || (data == struc)) {
+ continue;
+ }
+ switch (i) {
+ case HASH_KEY_IS_LONG:
+ d.type = IS_LONG;
+ d.value.lval = index;
+ php3api_var_serialize(buf, &d);
+ break;
+ case HASH_KEY_IS_STRING:
+ d.type = IS_STRING;
+ d.value.str.val = key;
+ d.value.str.len = strlen(key);
+ php3api_var_serialize(buf, &d);
+ efree(key);
+ break;
+ }
+ php3api_var_serialize(buf, data);
+ }
+ }
+ STR_CAT(buf, "}", 1);
+ return;
+
+ default:
+ STR_CAT(buf, "i:0;", 4);
+ return;
+ }
+}
+
+
+int php3api_var_unserialize(pval *rval, char **p, char *max)
+{
+ char *q;
+ char *str;
+ int i;
+
+ switch (**p) {
+ case 'i':
+ if (*((*p) + 1) != ':') {
+ return 0;
+ }
+ q = *p;
+ while (**p && **p != ';') {
+ (*p)++;
+ }
+ if (**p != ';') {
+ return 0;
+ }
+ (*p)++;
+ rval->type = IS_LONG;
+ rval->value.lval = atol(q + 2);
+ return 1;
+
+ case 'd':
+ if (*((*p) + 1) != ':') {
+ return 0;
+ }
+ q = *p;
+ while (**p && **p != ';') {
+ (*p)++;
+ }
+ if (**p != ';') {
+ return 0;
+ }
+ (*p)++;
+ rval->type = IS_DOUBLE;
+ rval->value.dval = atof(q + 2);
+ return 1;
+
+ case 's':
+ if (*((*p) + 1) != ':') {
+ return 0;
+ }
+ (*p) += 2;
+ q = *p;
+ while (**p && **p != ':') {
+ (*p)++;
+ }
+ if (**p != ':') {
+ return 0;
+ }
+ i = atoi(q);
+ if (i < 0 || (*p + 3 + i) > max || *((*p) + 1) != '\"' ||
+ *((*p) + 2 + i) != '\"' || *((*p) + 3 + i) != ';') {
+ return 0;
+ }
+ (*p) += 2;
+ str = emalloc(i + 1);
+ if (i > 0) {
+ memcpy(str, *p, i);
+ }
+ str[i] = 0;
+ (*p) += i + 2;
+ rval->type = IS_STRING;
+ rval->value.str.val = str;
+ rval->value.str.len = i;
+ return 1;
+
+ case 'a':
+ rval->type = IS_ARRAY;
+ goto got_array;
+
+ case 'o':
+ rval->type = IS_OBJECT;
+
+ got_array:
+ (*p) += 2;
+ i = atoi(*p);
+ rval->value.ht = (HashTable *) emalloc(sizeof(HashTable));
+ _php3_hash_init(rval->value.ht, i + 1, NULL, PVAL_DESTRUCTOR, 0);
+ while (**p && **p != ':') {
+ (*p)++;
+ }
+ if (**p != ':' || *((*p) + 1) != '{') {
+ return 0;
+ }
+ for ((*p) += 2; **p && **p != '}' && i > 0; i--) {
+ pval key;
+ pval data;
+
+ if (!php3api_var_unserialize(&key, p, max)) {
+ return 0;
+ }
+ if (!php3api_var_unserialize(&data, p, max)) {
+ return 0;
+ }
+ switch (key.type) {
+ case IS_LONG:
+ _php3_hash_index_update(rval->value.ht, key.value.lval, &data, sizeof(data), NULL);
+ break;
+ case IS_STRING:
+ _php3_hash_add(rval->value.ht, key.value.str.val, key.value.str.len + 1, &data, sizeof(data), NULL);
+ break;
+ }
+ pval_destructor(&key);
+ }
+ return *((*p)++) == '}';
+
+ default:
+ return 0;
+ }
+}
+
+
+PHP_FUNCTION(serialize)
+{
+ pval *struc;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &struc) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ return_value->type = IS_STRING;
+ return_value->value.str.val = NULL;
+ return_value->value.str.len = 0;
+ php3api_var_serialize(return_value, struc);
+}
+
+
+PHP_FUNCTION(unserialize)
+{
+ pval *buf;
+
+ if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &buf) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ if (buf->type == IS_STRING) {
+ char *p = buf->value.str.val;
+ if (!php3api_var_unserialize(return_value, &p, p + buf->value.str.len)) {
+ RETURN_FALSE;
+ }
+ } else {
+ RETURN_FALSE;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/internal_functions.c b/internal_functions.c
index 7277f4a1f0..09d78e57d1 100644
--- a/internal_functions.c
+++ b/internal_functions.c
@@ -40,44 +40,30 @@
#include <stdlib.h>
#include <stdio.h>
+#include "ext/standard/php3_standard.h"
+#include "ext/gd/php3_gd.h"
+
#include "functions/php3_ifx.h"
#include "functions/php3_ldap.h"
#include "functions/php3_mysql.h"
#include "functions/php3_bcmath.h"
#include "functions/php3_msql.h"
-#include "functions/basic_functions.h"
-#include "functions/phpmath.h"
-#include "functions/php3_string.h"
#include "functions/php3_oci8.h"
#include "functions/oracle.h"
-#include "functions/base64.h"
-#include "functions/php3_dir.h"
-#include "functions/dns.h"
#include "functions/php3_pgsql.h"
#include "functions/php3_velocis.h"
#include "functions/php3_sybase.h"
#include "functions/php3_sybase-ct.h"
-#include "functions/reg.h"
-#include "functions/php3_mail.h"
#include "functions/imap.h"
-#include "functions/md5.h"
-#include "functions/php3_gd.h"
-#include "functions/html.h"
#include "functions/dl.h"
#include "functions/head.h"
#include "functions/post.h"
-#include "functions/exec.h"
#include "functions/php3_solid.h"
#include "functions/adabasd.h"
-#include "functions/file.h"
#include "functions/dbase.h"
#include "functions/hw.h"
#include "functions/filepro.h"
#include "functions/db.h"
-#include "functions/php3_syslog.h"
-#include "functions/php3_filestat.h"
-#include "functions/php3_browscap.h"
-#include "functions/pack.h"
#include "functions/php3_unified_odbc.h"
#include "dl/snmp/php3_snmp.h"
#include "functions/php3_zlib.h"
@@ -127,7 +113,6 @@ zend_module_entry *php3_builtin_modules[] =
crypt_module_ptr,
dbm_module_ptr,
bcmath_module_ptr,
- browscap_module_ptr,
snmp_module_ptr,
pack_module_ptr,
php3_zlib_module_ptr,
diff --git a/main/configuration-parser.y b/main/configuration-parser.y
index 22b6e8e400..20af47b4db 100644
--- a/main/configuration-parser.y
+++ b/main/configuration-parser.y
@@ -37,8 +37,8 @@
#include "php_globals.h"
#include "php_ini.h"
#include "functions/dl.h"
-#include "functions/file.h"
-#include "functions/php3_browscap.h"
+#include "ext/standard/file.h"
+#include "ext/standard/php3_browscap.h"
#include "zend_extensions.h"
#if WIN32
diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c
index 7586a81700..367114bbc9 100644
--- a/main/fopen_wrappers.c
+++ b/main/fopen_wrappers.c
@@ -55,10 +55,7 @@
#include "safe_mode.h"
#include "php3_realpath.h"
#include "functions/head.h"
-#include "functions/url.h"
-#include "functions/base64.h"
-#include "functions/fsock.h"
-#include "functions/php3_string.h"
+#include "ext/standard/php3_standard.h"
#include "zend_compile.h"
#if HAVE_PWD_H
diff --git a/main/main.c b/main/main.c
index 576444478d..0858a4d97e 100644
--- a/main/main.c
+++ b/main/main.c
@@ -67,12 +67,9 @@
#include "main.h"
#include "control_structures.h"
#include "fopen-wrappers.h"
-#include "functions/basic_functions.h"
-#include "functions/info.h"
-#include "functions/head.h"
+#include "ext/standard/php3_standard.h"
#include "functions/post.h"
#include "functions/head.h"
-#include "functions/type.h"
#include "snprintf.h"
#if WIN32|WINNT
#include <io.h>
diff --git a/main/php_version.h b/main/php_version.h
index a2042691b9..498e3686a4 100644
--- a/main/php_version.h
+++ b/main/php_version.h
@@ -1 +1 @@
-#define PHP_VERSION "4.0pa1"
+#define PHP_VERSION "4.0pa1"
diff --git a/main/safe_mode.c b/main/safe_mode.c
index 8b712408ee..1b96bdf7dd 100644
--- a/main/safe_mode.c
+++ b/main/safe_mode.c
@@ -39,7 +39,7 @@
#include <unistd.h>
#endif
#include <sys/stat.h>
-#include "functions/pageinfo.h"
+#include "ext/standard/pageinfo.h"
#include "safe_mode.h"
/*
diff --git a/scripts/armerge b/scripts/armerge
new file mode 100755
index 0000000000..cda9d711cc
--- /dev/null
+++ b/scripts/armerge
@@ -0,0 +1,67 @@
+#!/bin/sh
+#
+# +----------------------------------------------------------------------+
+# | PHP HTML Embedded Scripting Language Version 4.0 |
+# +----------------------------------------------------------------------+
+# | Copyright (c) 1997-1999 PHP Development Team (See Credits file) |
+# +----------------------------------------------------------------------+
+# | This program is free software; you can redistribute it and/or modify |
+# | it under the terms of one of the following licenses: |
+# | |
+# | A) the GNU General Public License as published by the Free Software |
+# | Foundation; either version 2 of the License, or (at your option) |
+# | any later version. |
+# | |
+# | B) the PHP License as published by the PHP Development Team and |
+# | included in the distribution in the file: LICENSE |
+# | |
+# | This program is distributed in the hope that it will be useful, |
+# | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+# | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+# | GNU General Public License for more details. |
+# | |
+# | You should have received a copy of both licenses referred to here. |
+# | If you did not, or have any questions about PHP licensing, please |
+# | contact core@php.net. |
+# +----------------------------------------------------------------------+
+# | Authors: Stig Sæther Bakken <ssb@fast.no> |
+# +----------------------------------------------------------------------+
+#
+# Archive merger. Usage: armerge libout.a dir1/libin1.a dir2/libin2.a ...
+# Creates the archive libout.a from the files in the rest of the
+# parameter list. If the input archives are in separate directories,
+# the names of the files inside them are prefixed before they are
+# merged into the output archive. The prefix used is the same as the
+# directory name with "/" replaced by "_" and a "_" at the end.
+#
+# $Id$
+#
+
+if test "$#" -lt "2"; then
+ echo "Usage: "`basename $0`" <out-archive> <in-archives...>"
+ exit 1
+fi
+
+out_archive=$1; shift
+in_archives=$@
+
+rm -f $out_archive
+
+for archive in $in_archives; do
+ files=`ar t $archive`
+ ar x $archive
+ dir=`dirname $archive`
+ if test "$dir" = "."; then
+ ext_files=$files
+ else
+ prefix=`echo $dir | sed -e 's#/#_#g'`_
+ prefix=`echo $prefix | sed -e 's#^\.\._##g'`
+ ext_files=""
+ for file in $files; do
+ mv "$file" "$prefix$file"
+ ext_files="$ext_files $prefix$file"
+ done
+ fi
+ ar vr $out_archive $ext_files
+ rm -f $ext_files
+done
diff --git a/scripts/config-stubs b/scripts/config-stubs
new file mode 100755
index 0000000000..9985066648
--- /dev/null
+++ b/scripts/config-stubs
@@ -0,0 +1,7 @@
+#!/bin/sh
+#
+# $Id$
+
+for stubfile in ext/*/config.m4; do
+ echo "sinclude($stubfile)"
+done
diff --git a/scripts/mkextlib.in b/scripts/mkextlib.in
new file mode 100755
index 0000000000..2370ae22a2
--- /dev/null
+++ b/scripts/mkextlib.in
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+outfile=$1; shift
+extensions=$@
+
+ext_libs=""
+for dir in $extensions; do
+ archive="$dir/libphpext_$dir.a"
+ if test ! -r "$archive"; then
+ echo `basename $0`": could not open $archive" >&2
+ exit 1
+ fi
+ ext_libs="$ext_libs $archive"
+done
+
+dir=`dirname $0`
+(set -x; $dir/armerge $outfile $ext_libs)
diff --git a/scripts/preconfig b/scripts/preconfig
new file mode 100755
index 0000000000..a8c6569af0
--- /dev/null
+++ b/scripts/preconfig
@@ -0,0 +1,7 @@
+#!/bin/sh
+#
+# $Id$
+
+makefiles=`echo ext/*/Makefile.am | sed -e 's/\.am//g'`
+rm -f configure.in
+sed -e "s#@@EXT_MAKEFILES@@#$makefiles#" configure.in.in > configure.in
diff --git a/setup b/setup
index b0779136a6..0a9b30dffd 100644
--- a/setup
+++ b/setup
@@ -219,24 +219,25 @@ define_option with-apache 'Build as an Apache module?' yesnodir \
The CGI version also enables Apache users to run different PHP3-enabled\n
pages under different user-ids.'
-define_option with-mod_charset 'Enable transfer tables used by mod_charset?' yesno no \
+if test "$option_value_with_apache" != "no"; then
+ define_option with-mod_charset 'Enable transfer tables used by mod_charset?' yesno no \
' Whether to respect transfer tables used by mod_charset when PHP compiled\n
as Apache module. It is required to allow mod_charset (aka Russian Apache)\n
to work properly.'
+fi
-define_option with-fhttpd 'Build as an fhttpd module?' yesnodir \
+if test "$option_value_with_apache" = "no"; then
+ define_option with-fhttpd 'Build as an fhttpd module?' yesnodir \
'no /usr/local/src/fhttpd fhttpd sources' \
' Whether to build PHP as fhttpd module. If you are running\n
fhttpd, building PHP as a module will give better performance,\n
more control and remote execution capability. More info about fhttpd \n
can be found at http://phobos.illtel.denver.co.us/pub/fhttpd/.'
+fi
-define_option with-gd 'GD support?' yesnodir \
- "yes /usr GD install" \
-' Whether to include GD support. If PHP can find the GD libraries\n
- on your system, it will be included automatically. You should enter\n
- something here if you do not want to include GD support or if you\n
- have installed GD in some unusual directory.'
+for stub in ext/*/setup.stub; do
+ test -f $stub && . $stub
+done
define_option with-oracle 'Oracle support?' yesnodir \
"no $oradir Oracle home" \