From aceaabceffd537a0ed83fa25e189b08eae585f4a Mon Sep 17 00:00:00 2001 From: Zeev Suraski Date: Wed, 7 Apr 1999 21:05:13 +0000 Subject: PHP 4.0 --- BUGS | 11 + CHANGES | 624 ++++++++++ CODING_STANDARDS | 149 +++ COPYING | 339 ++++++ CREDITS | 176 +++ ChangeLog | 859 ++++++++++++++ EXTENSION_STATUS | 54 + FUNCTION_LIST.txt | 538 +++++++++ INSTALL | 159 +++ LICENSE | 64 ++ Makefile.in | 1078 +++++++++++++++++ README.QNX | 57 + README.WIN32 | 59 + TODO | 100 ++ WISHLIST | 17 + WISHLIST-3.1 | 55 + acconfig.h | 261 +++++ aclocal.m4 | 417 +++++++ apMakefile.libdir | 4 + apMakefile.tmpl | 77 ++ apidoc.txt | 492 ++++++++ bison.simple | 705 ++++++++++++ build-defs.h.in | 85 ++ calendar.mak | 244 ++++ config.guess | 743 ++++++++++++ config.h.in | 489 ++++++++ config.sub | 939 +++++++++++++++ configure.in | 1965 +++++++++++++++++++++++++++++++ control_structures.h | 46 + crypt.mak | 204 ++++ cvsusers | 62 + dbase.mak | 234 ++++ dbm.mak | 201 ++++ ext/ereg/regex/COPYRIGHT | 20 + ext/ereg/regex/Makefile.in | 141 +++ ext/ereg/regex/README | 32 + ext/ereg/regex/WHATSNEW | 92 ++ ext/ereg/regex/cclass.h | 31 + ext/ereg/regex/cname.h | 102 ++ ext/ereg/regex/debug.c | 242 ++++ ext/ereg/regex/engine.c | 1019 +++++++++++++++++ ext/ereg/regex/main.c | 510 +++++++++ ext/ereg/regex/mkh | 76 ++ ext/ereg/regex/regcomp.c | 1546 +++++++++++++++++++++++++ ext/ereg/regex/regerror.c | 124 ++ ext/ereg/regex/regex.3 | 502 ++++++++ ext/ereg/regex/regex.7 | 233 ++++ ext/ereg/regex/regex.dsp | 106 ++ ext/ereg/regex/regex.dsw | 29 + ext/ereg/regex/regex.h | 79 ++ ext/ereg/regex/regex.mak | 304 +++++ ext/ereg/regex/regex2.h | 138 +++ ext/ereg/regex/regexec.c | 140 +++ ext/ereg/regex/regfree.c | 37 + ext/ereg/regex/split.c | 316 +++++ ext/ereg/regex/tests | 475 ++++++++ ext/ereg/regex/utils.h | 22 + ext/snmp/winsnmp.c | 228 ++++ filepro.mak | 194 ++++ foo | 9 + foo2 | 3 + foo3 | 43 + foo4 | 41 + footer | 7 + gd.mak | 214 ++++ getopt.c | 171 +++ getopt.h | 9 + header | 29 + hyperwave.mak | 214 ++++ imap4.mak | 194 ++++ install-sh | 238 ++++ internal_functions.c | 171 +++ ldap.mak | 194 ++++ libphp3.module.in | 7 + ltconfig | 1064 +++++++++++++++++ ltmain.sh | 1813 +++++++++++++++++++++++++++++ main.h | 72 ++ main/alloca.c | 505 ++++++++ main/config.w32.h | 294 +++++ main/configuration-parser.y | 415 +++++++ main/configuration-scanner.l | 170 +++ main/fopen_wrappers.c | 1000 ++++++++++++++++ main/fopen_wrappers.h | 90 ++ main/internal_functions_registry.h | 57 + main/logos.h | 805 +++++++++++++ main/main.c | 2222 ++++++++++++++++++++++++++++++++++++ main/php.h | 485 ++++++++ main/php3_compat.h | 80 ++ main/php_ini.c | 148 +++ main/php_ini.h | 48 + main/php_version.h | 1 + main/safe_mode.c | 156 +++ main/safe_mode.h | 7 + main/snprintf.c | 935 +++++++++++++++ main/snprintf.h | 56 + main/win95nt.h | 74 ++ makeall.bat | 13 + makedist | 126 ++ makeparser.bat | 4 + mod_php3.c | 643 +++++++++++ mod_php3.h | 107 ++ msql.mak | 194 ++++ msql1.mak | 212 ++++ mtparser.bat | 4 + mysql.mak | 197 ++++ objects | 7 + output.c | 226 ++++ output.h | 18 + php3.ini-dist | 243 ++++ php3_realpath.c | 290 +++++ php3_realpath.h | 41 + php3_sprintf.c | 54 + php3_threads.c | 79 ++ php3_threads.h | 33 + php3extra.dsw | 41 + php3sapi.dsw | 89 ++ php4.dsp | 660 +++++++++++ php_custom_build.mak | 269 +++++ press-release-3.0.txt | 47 + recurse | 21 + regex/COPYRIGHT | 20 + regex/Makefile.in | 141 +++ regex/README | 32 + regex/WHATSNEW | 92 ++ regex/cclass.h | 31 + regex/cname.h | 102 ++ regex/debug.c | 242 ++++ regex/engine.c | 1019 +++++++++++++++++ regex/main.c | 510 +++++++++ regex/mkh | 76 ++ regex/regcomp.c | 1546 +++++++++++++++++++++++++ regex/regerror.c | 124 ++ regex/regex.3 | 502 ++++++++ regex/regex.7 | 233 ++++ regex/regex.dsp | 106 ++ regex/regex.dsw | 29 + regex/regex.h | 79 ++ regex/regex.mak | 304 +++++ regex/regex2.h | 138 +++ regex/regexec.c | 140 +++ regex/regfree.c | 37 + regex/split.c | 316 +++++ regex/tests | 475 ++++++++ regex/utils.h | 22 + request_info.c | 259 +++++ request_info.h | 62 + setup | 519 +++++++++ snmp.mak | 194 ++++ stamp-h.in | 0 test.php4 | 16 + test.pl | 34 + test_class_inheritance | 29 + testarray | 21 + testarray.pl | 5 + testarray2 | 5 + testarray2.pl | 3 + testclassfunc | 10 + testcom | 9 + testfe | 21 + testfunc | 36 + testfunc.pl | 20 + testfunc2 | 19 + testfunc2.pl | 22 + testfuncref | 8 + testinclude | 5 + testobj | 9 + tls.c | 113 ++ tls.h | 208 ++++ win32/flock.c | 83 ++ win32/flock.h | 11 + win32/grp.h | 31 + win32/param.h | 16 + win32/pwd.c | 79 ++ win32/pwd.h | 57 + win32/readdir.c | 111 ++ win32/readdir.h | 37 + win32/sendmail.c | 511 +++++++++ win32/sendmail.h | 46 + win32/signal.h | 4 + win32/syslog.h | 73 ++ win32/time.c | 156 +++ win32/time.h | 40 + win32/unistd.h | 1 + win32/wfile.c | 17 + win32/wfile.h | 16 + win32/winutil.c | 29 + win32/winutil.h | 1 + win32/wsyslog.c | 128 +++ zlib.mak | 194 ++++ 189 files changed, 43488 insertions(+) create mode 100644 BUGS create mode 100644 CHANGES create mode 100644 CODING_STANDARDS create mode 100644 COPYING create mode 100644 CREDITS create mode 100644 ChangeLog create mode 100644 EXTENSION_STATUS create mode 100644 FUNCTION_LIST.txt create mode 100644 INSTALL create mode 100644 LICENSE create mode 100644 Makefile.in create mode 100644 README.QNX create mode 100644 README.WIN32 create mode 100644 TODO create mode 100644 WISHLIST create mode 100644 WISHLIST-3.1 create mode 100644 acconfig.h create mode 100644 aclocal.m4 create mode 100644 apMakefile.libdir create mode 100644 apMakefile.tmpl create mode 100644 apidoc.txt create mode 100644 bison.simple create mode 100644 build-defs.h.in create mode 100644 calendar.mak create mode 100644 config.guess create mode 100644 config.h.in create mode 100644 config.sub create mode 100644 configure.in create mode 100644 control_structures.h create mode 100644 crypt.mak create mode 100644 cvsusers create mode 100644 dbase.mak create mode 100644 dbm.mak create mode 100644 ext/ereg/regex/COPYRIGHT create mode 100644 ext/ereg/regex/Makefile.in create mode 100644 ext/ereg/regex/README create mode 100644 ext/ereg/regex/WHATSNEW create mode 100644 ext/ereg/regex/cclass.h create mode 100644 ext/ereg/regex/cname.h create mode 100644 ext/ereg/regex/debug.c create mode 100644 ext/ereg/regex/engine.c create mode 100644 ext/ereg/regex/main.c create mode 100644 ext/ereg/regex/mkh create mode 100644 ext/ereg/regex/regcomp.c create mode 100644 ext/ereg/regex/regerror.c create mode 100644 ext/ereg/regex/regex.3 create mode 100644 ext/ereg/regex/regex.7 create mode 100644 ext/ereg/regex/regex.dsp create mode 100644 ext/ereg/regex/regex.dsw create mode 100644 ext/ereg/regex/regex.h create mode 100644 ext/ereg/regex/regex.mak create mode 100644 ext/ereg/regex/regex2.h create mode 100644 ext/ereg/regex/regexec.c create mode 100644 ext/ereg/regex/regfree.c create mode 100644 ext/ereg/regex/split.c create mode 100644 ext/ereg/regex/tests create mode 100644 ext/ereg/regex/utils.h create mode 100644 ext/snmp/winsnmp.c create mode 100644 filepro.mak create mode 100644 foo create mode 100644 foo2 create mode 100644 foo3 create mode 100644 foo4 create mode 100644 footer create mode 100644 gd.mak create mode 100644 getopt.c create mode 100644 getopt.h create mode 100644 header create mode 100644 hyperwave.mak create mode 100644 imap4.mak create mode 100644 install-sh create mode 100644 internal_functions.c create mode 100644 ldap.mak create mode 100644 libphp3.module.in create mode 100644 ltconfig create mode 100644 ltmain.sh create mode 100644 main.h create mode 100644 main/alloca.c create mode 100644 main/config.w32.h create mode 100644 main/configuration-parser.y create mode 100644 main/configuration-scanner.l create mode 100644 main/fopen_wrappers.c create mode 100644 main/fopen_wrappers.h create mode 100644 main/internal_functions_registry.h create mode 100644 main/logos.h create mode 100644 main/main.c create mode 100644 main/php.h create mode 100644 main/php3_compat.h create mode 100644 main/php_ini.c create mode 100644 main/php_ini.h create mode 100644 main/php_version.h create mode 100644 main/safe_mode.c create mode 100644 main/safe_mode.h create mode 100644 main/snprintf.c create mode 100644 main/snprintf.h create mode 100644 main/win95nt.h create mode 100755 makeall.bat create mode 100755 makedist create mode 100755 makeparser.bat create mode 100644 mod_php3.c create mode 100644 mod_php3.h create mode 100644 msql.mak create mode 100644 msql1.mak create mode 100755 mtparser.bat create mode 100644 mysql.mak create mode 100644 objects create mode 100644 output.c create mode 100644 output.h create mode 100644 php3.ini-dist create mode 100644 php3_realpath.c create mode 100644 php3_realpath.h create mode 100644 php3_sprintf.c create mode 100644 php3_threads.c create mode 100644 php3_threads.h create mode 100644 php3extra.dsw create mode 100644 php3sapi.dsw create mode 100644 php4.dsp create mode 100644 php_custom_build.mak create mode 100644 press-release-3.0.txt create mode 100644 recurse create mode 100644 regex/COPYRIGHT create mode 100644 regex/Makefile.in create mode 100644 regex/README create mode 100644 regex/WHATSNEW create mode 100644 regex/cclass.h create mode 100644 regex/cname.h create mode 100644 regex/debug.c create mode 100644 regex/engine.c create mode 100644 regex/main.c create mode 100644 regex/mkh create mode 100644 regex/regcomp.c create mode 100644 regex/regerror.c create mode 100644 regex/regex.3 create mode 100644 regex/regex.7 create mode 100644 regex/regex.dsp create mode 100644 regex/regex.dsw create mode 100644 regex/regex.h create mode 100644 regex/regex.mak create mode 100644 regex/regex2.h create mode 100644 regex/regexec.c create mode 100644 regex/regfree.c create mode 100644 regex/split.c create mode 100644 regex/tests create mode 100644 regex/utils.h create mode 100644 request_info.c create mode 100644 request_info.h create mode 100644 setup create mode 100644 snmp.mak create mode 100644 stamp-h.in create mode 100644 test.php4 create mode 100644 test.pl create mode 100644 test_class_inheritance create mode 100644 testarray create mode 100644 testarray.pl create mode 100644 testarray2 create mode 100644 testarray2.pl create mode 100644 testclassfunc create mode 100644 testcom create mode 100644 testfe create mode 100644 testfunc create mode 100644 testfunc.pl create mode 100644 testfunc2 create mode 100644 testfunc2.pl create mode 100644 testfuncref create mode 100644 testinclude create mode 100644 testobj create mode 100644 tls.c create mode 100644 tls.h create mode 100644 win32/flock.c create mode 100644 win32/flock.h create mode 100644 win32/grp.h create mode 100644 win32/param.h create mode 100644 win32/pwd.c create mode 100644 win32/pwd.h create mode 100644 win32/readdir.c create mode 100644 win32/readdir.h create mode 100644 win32/sendmail.c create mode 100644 win32/sendmail.h create mode 100644 win32/signal.h create mode 100644 win32/syslog.h create mode 100644 win32/time.c create mode 100644 win32/time.h create mode 100644 win32/unistd.h create mode 100644 win32/wfile.c create mode 100644 win32/wfile.h create mode 100644 win32/winutil.c create mode 100644 win32/winutil.h create mode 100644 win32/wsyslog.c create mode 100644 zlib.mak diff --git a/BUGS b/BUGS new file mode 100644 index 0000000000..8966692d58 --- /dev/null +++ b/BUGS @@ -0,0 +1,11 @@ +If you think you've found a bug in PHP3, you can report it on the bug +reporting page at: + http://www.php.net/ + +Current Known Bugs: + +* split() function doesn't return regex errors nicely +* Preprocessed scripts don't work with require() and define() +* unset() doesn't actually erase the variables it just marks them as uninitialized +* Some parts in the language core prevent more than 256 arguments in function + calls from being possible \ No newline at end of file diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000000..b3b9d8bea5 --- /dev/null +++ b/CHANGES @@ -0,0 +1,624 @@ +Noticeable Changes between PHP/FI 2.0 and PHP 3.0 +================================================= + +This file was designed to be viewed with a tab size of 4 characters. + +This file is divided into 4 sections: +1. Downwards incompatible language changes. This section includes all of + the changes in the core language which may require people to modify + their scripts before using them with PHP 3.0. It does NOT list + changes made in the behavior of specific functions. +2. New language features. This section includes all of the new additions + to the core language, that may be used to enhance scripts designed for + PHP 3.0. Likewise, it does not include a listing of new functions. +3. Structural changes not directly effecting the end user. The core + of PHP 3.0 is a complete rewrite. As such, many issues effecting + PHP/FI 2.0 were addressed and vastly improved in this version, + resulting in a much more stable and efficient implementation. This + section lists these changes in design. +4. Other changes that don't fit in any of the above categories. + +Please remember that PHP 3.0's core is a complete rewrite, and thus, +there may be other undocumented incompatibilities we haven't thought +of ourselves. If you think you've found a incompatibility (or a new +feature) which is not listed here, please mail us at +php-dev@php.iquest.net. + + + + - Zeev + +------------------------------------------------------------------------------ + +Downwards incompatible language changes +======================================= + +[1] The close-PHP tag has changed from > to ?> + + This means that instead of writing: + + + + You should write: + + + + PHP3 also includes support for a longer-form start tag that is + XML-compliant: + + + + The ability to use the short start tag ('5) + break; + if ($i>5) + break 2; + } + } + + The first break statement would end the inner loop every time $j is + greater than 5. The second break statement would end both the inner + and outer loop when $i is greater than 5. + + Note: For this matter, switch statements are considered as loops. So + if you write "break 2;" inside a switch statement, you would be asking + to break out of the switch, and the innermost loop in which is nested. + + +[5] Switched to C-style declaration of functions. + + Here's a pretty useless function which makes a good example: + + function concat($str1,$str2) + { + return $str1.$str2; + } + + NOTE: The old style function definition is still supported, to + allow easier upgrading from PHP/FI 2.0 scripts. Simply + change 'function' to 'old_function' for these functions. + + +[6] OOP support + + Classes and inheritance are supported to a limited extent in PHP 3.0. + Here's how to declare a simple class: + + class simple_class { + var $property1,$property2; + var $property3=5; + + function display() { + printf("p1=%d, p2=%d, p3=%d\n", + $this->property1, + $this->property2, + $this->property3); + } + function init($p1,$p2) { + $this->property1 = $p1; + $this->property2 = $p2; + } + }; + + Here's how to create an object of that class: + + $obj = new simple_class; + + At this point, $obj is an object with 2 uninitialized variables, 1 + initialized variable, and 2 member functions. No protection is made on + the internals of the object, and using its properties is simple: + + $obj->property1 = 7; + + would assign 7 to $property1 inside $obj. Calling member functions is + also simple: + + $obj->display() + + would run the display() member function of $obj. Note that the + implementation of display() uses the special variable $this, which is + replaced with the object the function is called on. + + Inheritance is pretty simple too: + + class complex_class extends simple_class { + var $property4="test"; + + function display() { + printf("p1=%d, p2=%d, p3=%d, p4=%d\n", + $this->property1, + $this->property2, + $this->property3, + $this->property4); + } + } + + Basically, the class complex_class inherits everything from its parent, + simple_class, except properties or member functions which override the + ones in the parent. In this example, since we supply an alternative + display() function, it would be used with complex_class objects instead + of the display() function that was declared in simple_class. On the other + hand, since we don't supply an alternative init() function, complex_class + objects would have the same init() function as simple_class objects do. + + As with expressions, it's impossible to teach OOP in a few lines, and + personally I'm unclear as to how useful this would be in day to day + scripting. If you like this, play with this until you figure it out :) + + Objects can reside in arrays, and can contain arrays. However, + a limitation of the current implementation doesn't allow an object + to contain an array of objects (actually, this is allowed, but + there's no way to address the properties of such an object directly, + but only indirectly). For example, assuming $a[3] is an object, + $a[3]->b[2] is an object as well, you can't address the properties + of $a[3]->b[2] (i.e. you can't write $a[3]->b[2]->foo = "bar", for + instance). + + +[7] Function pointers are now supported. + + A simple illustrative example: + + $func_ptr = "time"; + $current_time = $func_ptr(); + + is identical to + + $current_time = time(); + + +[8] Indirect references are much more powerful. + + For example, one can use the dollar operator an infinite amount of times: + + $a = "b"; + $b = "c"; + $c = "d"; + $d = "e"; + $e = "Testing\n"; + + echo $$$$$a; + + Would display $e's content, which is "Testing\n". + + In addition, one can use complex expressions to generate variable names + using a perl-like notation: + + $i="123"; + ${"test".$i} = 5; + + would assign 5 to $test123. + +[9] A string concatenation operator was added, '+' no longer concatenates strings. + + A perl-like string concatenation operator was added, the '.' operator. + It converts both of its arguments to strings, and concatenates them. + For example: + + $result = "abcd".5; + + assigns "abcd5" to result. Note that under PHP 3.0, the '+' operator + no longer performs concatenation if its arguments are strings. Use + the '.' operator instead. + +[10] Supports passing function arguments by references instead of by value. + + Support for passing function arguments by reference instead of by value + has been added. This doesn't result in having to change the function + implementations in any way, but, when calling the function, you can + decide on whether the variable you supply would actually be changed by + the function, or a copy of it. + + Example: + + function inc($arg) + { + $arg++; + } + + $i=0; + inc($i); # here $i in the outer scope wouldn't change, and remain 0 + inc(&$i); # here $i is passed by reference, and would change to 1 + + +[11] Support for multidimensional arrays. + + (Or as Andi calls them, 'hyperdimensional variables'.) + + The easiest way to define this support of PHP 3.0 is inductive - + arrays can contain any type of variables, including other arrays. + A simple example: + + $a[0]=5; + $a[1]["testing"]=17; + $b["foo"]=$a; + + Ok, so it may be not so simple. Play with it, it's pretty powerful. + + +[12] Array initialization is now supported. + + For example, let's say you want to initialize a lookup table to convert + number to month names: + + $months = array("January", "February", "March", + "April", "May", "June", "July", "August", + "September", "October", "November", "December"); + + would assign $months[0] to be January, $months[1] to be February, etc. + Alternately, you may want the count to start at '1' instead of 0. + You can do so easily: + + $months = array(1=>"January", "February", "March", + "April", "May", "June", "July", "August", + "September", "October", "November", "December"); + + Also, you can specify an index for every entry, not just the first one: + + $first_names = array("Doe"=>"John", "Gates"=>"William", + "Clinton"=>"Bill" }); + + would assign $first_names["Doe"]="John", etc. + + +[13] Perl style lists now supported. + + Multiple values from arrays may now be assigned into several + variables using one assignment. For example: + + $str = "johndoe:x:555:555:Doe, John:/home/johndoe:/bin/tcsh"; + + list($username,$passwd,$uid,$gid,$realname,$homedir,$shell) = + explode(":",$str); + + Would assign 'johndoe' into $username, 'x' into $passwd, etc. + + +[14] Colons are supported in 'case' and 'default' statements. + + For example: + + switch($value) { + case 'A': + statement; + break; + case 'B': + statement; + break; + case 'C': + statement; + /* fall-through */ + default: + statement; + } + + Semicolons are still supported, but when writing new scripts, they + should be phased out in favour of colons. + + +------------------------------------------------------------------------------ + + +Non Language Related New Features +================================= + +[1] Persistent resource lists. + + In plain english this means that there's now an easy way of writing the + SQL drivers so that they don't open and close the SQL link every time, + but instead open it the first time it's required, and then use it on + every later hit. As of PHP 3.0a1, only the MySQL, mSQL and PostgresSQL + drivers have been changed (rewritten) to take advantage of this option. + To use it, use mysql_pconnect() instead of mysql_connect() (or the + equivalents for the two other databases). + + +[2] Configuration file. + + PHP now has its own configuration file, and many compile-time options + of PHP2 are now configurable at runtime. + + +[3] Syntax Highlighting. + + A syntax highlighter has been built into PHP 3.0, which means PHP 3.0 can + display your code, syntax highlighted, instead of executing it. + There are currently two ways to use the syntax highlighter. One is to + use the show_source() statement. This statement is identical to the + include() statement, except instead of executing the file, it displays + its source syntax highlighted. + The second way is possible only when running as an apache module, and is + to define a special extension for PHP 3.0 source files (e.g. .php3s) + and instruct apache to automatically syntax highlight them. + + +[4] Loadable modules. + + This would have a huge impact on the Windows version, and would probably + be used in the UNIX environment as well. One can now add PHP internal + functions in runtime by loading a dynamic module. This is known to work + under Solaris, Linux and Win32 at this time, but would be ported to any + other capable platform if an incompatability is found. + + +------------------------------------------------------------------------------ + + +Other Interesting Issues +======================== + + +[1] Improved performance. + + The performance of PHP 3.0 is much better than the one of PHP/FI 2.0. + Memory consumption has been dramatically reduced in many cases, due + to the use of an internal memory manager, instead of apache's pools. + Speedwise, PHP 3.0 is somewhere between 2 and 3 times faster than + PHP/FI 2.0. + + +[2] More reliable parser. + + After PHP 3.0 is well tested, it'll be pretty safe to say that it's + more reliable than PHP/FI 2.0 is. While PHP/FI 2.0 performed well on + simple, and fairly complex scripts, a fundamental design difference + from PHP 3.0 makes it more prone to errors. In PHP 3.0, obscure parser + problems are much less likely. + + +[3] Improved C API. + + If you're a C coder, adding functionality to PHP was never easier. + A pretty well documented API is available (apidoc.txt), and you no longer + have to touch the parser or scanner code when adding your function. + Also, it's more complicated to 'go wrong' when implementing a PHP3 + function than it was in PHP2 (no stack to maintain) - but of course, + you can mess up here too :) + + +[4] Name change. + + PHP/FI 2.0 was renamed to PHP 3.0, and the meaning has changed from + 'Personal Home Pages / Forms Interpreter' to 'PHP: Hypertext Preprocessor'. + 'Personal' home pages was an understatement for PHP/FI 2.0, and is + definitely an understatement for PHP 3.0. diff --git a/CODING_STANDARDS b/CODING_STANDARDS new file mode 100644 index 0000000000..477cad33c9 --- /dev/null +++ b/CODING_STANDARDS @@ -0,0 +1,149 @@ +PHP Coding Standards +==================== + + +This file lists several standards that any programmer, adding or changing +code in PHP, should follow. Since this file was added at a very late +stage of the development of PHP v3.0, the code base does not (yet) fully +follow it, but it's going in that general direction. +This is an initial version - it'll most probably grow as time passes. + + +Code Implementation +------------------- + +[1] Functions that are given pointers to resources should not free them + +For instance, function int mail(char *to, char *from) should NOT free +to and/or from. +Exceptions: + + - The function's designated behavior is freeing that resource. E.g. efree() + - The function is given a boolean argument, that controls whether or not + the function may free its arguments (if true - the function must free its + arguments, if false - it must not) + - Low-level parser routines, that are tightly integrated with the token + cache and the bison code for minimum memory copying overhead. + +[2] Functions that are tightly integrated with other functions within the + same module, and rely on each other non-trivial behavior, should be + documented as such and declared 'static'. They should be avoided if + possible. + +[3] Use definitions and macros whenever possible, so that constants have + meaningful names and can be easily manipulated. The only exceptions + to this rule are 0 and 1, when used as false and true (respectively). + Any other use of a numeric constant to specify different behavior + or actions should be done through a #define. + +[4] When writing functions that deal with strings, be sure to remember + that PHP holds the length property of each string, and that it + shouldn't be calculated with strlen(). Write your functions in a such + a way so that they'll take advantage of the length property, both + for efficiency and in order for them to be binary-safe. + Functions that change strings and obtain their new lengths while + doing so, should return that new length, so it doesn't have to be + recalculated with strlen() (e.g. _php3_addslashes()) + +[5] Use php3_error() to report any errors/warnings during code execution. + Use descriptive error messages, and try to avoid using identical + error strings for different stages of an error. For example, + if in order to obtain a URL you have to parse the URL, connect, + and retreive the text, assuming something can go wrong at each + of these stages, don't report an error "Unable to get URL" + on all of them, but instead, write something like "Unable + to parse URL", "Unable to connect to URL server" and "Unable + to fetch URL text", respectively. + +[6] NEVER USE strncat(). If you're absolutely sure you know what you're doing, + check its man page again, and only then, consider using it, and even then, + try avoiding it. + + +Naming Conventions +------------------ + +[1] Function names for user functions implementation should be prefixed with + "php3_", and followed by a word or an underscore-delimited list of words, + in lowercase letters, that describes the function. + +[2] Function names used by user functions implementations should be prefixed + with "_php3_", and followed by a word or an underscore-delimited list of + words, in lowercase letters, that describes the function. If applicable, + they should be declared 'static'. + +[3] Variable names must be meaningful. One letter variable names must be + avoided, except for places where the variable has no real meaning or + a trivial meaning (e.g. for (i=0; i<100; i++) ...). + +[4] Variable names should be in lowercase; Use underscores to seperate + between words. + + + +Syntax and indentation +---------------------- + +[1] Never use C++ style comments (i.e. // comment). Always use C-style + comments instead. PHP is written in C, and is aimed at compiling + under any ANSI-C compliant compiler. Even though many compilers + accept C++-style comments in C code, you have to ensure that your + code would compile with other compilers as well. + The only exception to this rule is code that is Win32-specific, + because the Win32 port is MS-Visual C++ specific, and this compiler + is known to accept C++-style comments in C code. + +[2] Use K&R-style. Of course, we can't and don't want to + force anybody to use a style she's not used to, but + at the very least, when you write code that goes into the core + of PHP or one of its standard modules, please maintain the K&R + style. This applies to just about everything, starting with + indentation and comment styles and up to function decleration + syntax. + +[3] Be generous with whitespace and braces. Always prefer + if (foo) { + bar; + } + to + if(foo)bar; + + Keep one empty line between the variable decleration section and + the statements in a block, as well as between logical statement + groups in a block. Maintain at least one empty line between + two functions, preferably two. + +Documentation and Folding Hooks +------------------------------- + +In order to make sure that the online documentation stays in line with +the code, each user-level function should have its user-level function +prototype before it along with a brief one-line description of what the +function does. It would look like this: + +/* {{{ proto int abs(int number) + Return the absolute value of the number */ +void php3_abs(INTERNAL_FUNCTION_PARAMETERS) { + ... +} +/* }}} */ + +The {{{ symbols are the default folding symbols for the folding mode in +Emacs. vim will soon have support for folding as well. Folding is very +useful when dealing with large files because you can scroll through the +file quickly and just unfold the function you wish to work on. The }}} +at the end of each function marks the end of the fold, and should be on +a separate line. + +The "proto" keyword there is just a helper for the doc/genfuncsummary script +which generates a full function summary. Having this keyword in front of the +function prototypes allows us to put folds elsewhere in the code without +messing up the function summary. + +Optional arguments are written like this: + +/* {{{ proto object imap_header(int stream_id, int msg_no [, int from_length [, int subject_length [, string default_host]]]) + +And yes, please keep everything on a single line, even if that line is massive. + + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000000..a43ea2126f --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/CREDITS b/CREDITS new file mode 100644 index 0000000000..19cc505032 --- /dev/null +++ b/CREDITS @@ -0,0 +1,176 @@ +PHP Version 3.0 Development Team + +------------------------------------------------------------------------------ + +Core Developers +=============== + +Rasmus Lerdorf (rasmus@lerdorf.on.ca) + +* Original language definition and implementation +* CGI loader and many internal functions +* Apache module support +* SNMP module +* Original mSQL, MySQL and Sybase modules +* Oracle module work + + +Andi Gutmans (andi@php.net) and Zeev Suraski (zeev@php.net) + +* New language definition and implementation +* Internal functions API design +* General hash table implementation for symbol tables, arrays and objects +* Memory manager +* Token cache manager +* A lot of internal functions (including hebrev :) and migration from PHP 2.0 +* Syntax highlighting mode +* Configuration file parser +* New persistent/multilink MySQL, PosgresSQL, Sybase and mSQL modules +* Win32 COM support + + +Stig Bakken (ssb@guardian.no) + +* Oracle support +* configure/install script work +* sprintf reimplementation +* XML support +* SGML documentation framework + + +Shane Caraveo (shane@caraveo.com) + +* Porting to Visual C++ +* Generalization to support different server APIs +* Work on ISAPI and NSAPI APIs + + +Jim Winstead (jimw@php.net) + +* Lots of PHP2 -> PHP3 porting +* dBase support +* URL parsing functions +* Makefile work +* Regex rewrite +* Win32 work + + +------------------------------------------------------------------------------ + +Major Contributors +================== + +* Jouni Ahto (jah@cultnet.fi) + Postgres, Informix + +* Alex Belits (abelits@phobos.illtel.denver.co.us) + fhttpd support + +* Bjørn Borud (borud@guardian.no) + soundex code and lots of enthusiasm + +* Christian Cartus (chc@idgruppe.de) + Informix Universal Server support + +* John Ellson (ellson@lucent.com) + Freetype support + +* Dean Gaudet (dgaudet@arctic.org) + Apache module debugging + helpful hints along the way + +* Mitch Golden (mgolden@interport.net) + Oracle testing and bug fixes + +* Danny Heijl (Danny.Heijl@cevi.be) + Informix SE support + +* Mark Henderson (mark@togglemedia.com) + Various odds and ends + +* Jaakko Hyvätti (jaakko@hyvatti.iki.fi) + Prototype cop, regular expression code fixes, CGI security issues + +* Amitay Isaacs (amitay@w-o-i.com) + LDAP + +* Andreas Karajannis (Andreas.Karajannis@gmd.de) + Adabas D, ODBC, Oracle + +* Igor Kovalenko (owl@infomarket.ru) + QNX support issues + +* Richard Lynch (lynch@lscorp.com) + Documentation + +* Tom May (tom@go2net.com) + Sybase-CT work + +* Muhammad A Muquit (MA_Muquit@fccc.ed) + Original Sybase module + +* Mark Musone (musone@edgeglobal.com) + IMAP + +* Jeroen van der Most (jvdmost@digiface.nl) + Solid + +* Chad Robinson (chadr@brttech.com) + Documentation, FilePro + +* Lachlan Roche (lr@www.wwi.com.au) + MD5 + +* Stefan Roehrich (sr@linux.de) + zlib + +* Nikolay P. Romanyuk (mag@redcom.ru) + Velocis support + +* Brian Schaffner (brian@tool.net) + ODBC support, PHP3 API testing + +* Egon Schmid (eschmid@delos.lf.net) + Documentation + +* (sopwith@redhat.com) + Solid + +* Colin Viebrock (cmv@privateworld.com) + Website graphic design and layout, PHP logo + +* Eric Warnke (ericw@albany.edu) + LDAP + +* Lars Torben Wilson (torben@netmill.com) + Documentation + +* Uwe Steinmann (Uwe.Steinmann@fernuni-hagen.de) + Hyperwave, PDF, Acrobat FDF Toolkit + +------------------------------------------------------------------------------ + +Beta Testers +------------ + +* Niklas Saers (berenmls@saers.com) + FreeBSD/x86 + +* Chuck Hagenbuch + Linux/x86 glibc2, MySQL, mod_ssl + +* Sascha Schumann (sas@schell.de) + FreeBSD/x86, PostgreSQL, IMAP, gdttf + +* Jim Jagielski (jim@jagunet.com) + A/UX, FreeBSD/x86 + +* Jouni Ahto (jah@cultnet.fi) + Debian Linux 2.0 + + + + +------------------------------------------------------------------------------ + +Andi Gutmans and Zeev Suraski would like to thank Professor Michael Rodeh for +his positive input during the initial development of the interpreter. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000000..76e826b96b --- /dev/null +++ b/ChangeLog @@ -0,0 +1,859 @@ +PHP 3.0 CHANGE LOG ChangeLog +||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +December 24 1998, Version 3.0.6 +- Fix GetImageSize() to work with non-standard jpg images +- Add Mersenne Twister functions (mt_rand, mt_srand, etc) +- Add str_replace() function +- Add chunk_split() function +- Fixed a bug in the memory limit code, in cases where $php_errormsg was + also used. +- Add iptcparse() function +- Adobe FDF supported +- getallheaders() NULL string fix +- Add all configuration directives to phpinfo() page +- Functions pack() and unpack() rewritten to be binary and buffer overrun + safe and behave like the Perl functions for all implemented format codes. +- Ensured that msql_error() will not return error messages generated by + previously-run scripts. +- Add base_convert() function +- Make sprintf() and printf() output binary safe +- Made gzgetc binary safe +- Add convert_cyr_string() and quoted_printable_decode() functions +- Fix ldap_free_result() core dump bug +- Add support for current OpenLDAP-2.0-devel library +- Add php3_asp_tags directive so it can be set from Apache config files +- Added UTF-8 support in the XML extension +- Make rand(min,max) safer on older platforms where the low-order bits have + short cycles. +- Added new pdf (Portable Document Format) module +- Added an XML parsing extension using James Clark's "expat" library +- Optimized parts of the token cache code. +- Terminate on out-of-memory errors. Until now, PHP could crash in out of + memory situations (clean-up, no real effect). +- Unterminated comments in include files were being reported with the wrong line + number. Fixed. +- Added ImageCopy() and ImageColorDeallocate(). ImageCopy() is about + 20% faster than ImageCopyResized(). ImageColorDeallocate() marks + palette entries free for reuse (by ). +- In the CGI version, it was impossible to access resources (e.g. SQL links, + images) from user-defined shutdown functions. Fixed. +- Added optional third parameter to strpos() to specify the offset to + start searching from. +- Fixed a crash bug in unset() when unsetting illegal variables (rare). +- Made ImageInterlace and ImageTransparentColor parameters optional, and made + them return the current/new settings. +- Optimized GetImageSize() . +- Made odbc_autocommit() without args return status +- Added connect workaround for OpenLink ODBC +- Added minimal InterBase support. Tested only on 4.0 & Linux. +- Fixed some memory leaks and bogus error messages in the URL handler of + the various file open functions. Should only affect error handling + in bad URLs. + +October 5 1998 Version 3.0.5 +- mysql_field_flags now reports all MySQL flags and the result is suitable + for automatic parsing. Compatibility warning: The result format has + changed. If you have scripts parsing the result of this function, you + may need to adapt them. +- Made nl2br() binary safe (not that it's of much use). +- Fixed a bug in the API function getThis(). It affected mostly the dir + functions, if nested within objects. +- Fixed a problem in require() in conjunction with switch(), and in some other + cases. Also fixed an identical problem with the call_user_function() API + function. +- Removed -lpthread when compiling with MySQL support. It caused various + serious problems when compiled into Apache. +- Add serialize() and unserialize() functions from jkl@njet.net +- Fix in_addr_t check for systems with in_addr_t in netinet/in.h +- Add atan2() function + +September 22 1998 Version 3.0.4 +- Added uksort() - array key sort using a user defined comparison function. +- Added 'j' support to date() - generates the day of the month, without + possible leading zeros. +- Added support for multiple crypt() encryptions if the system supports it +- Added optional support for ASP-style <% %> and <%= tags +- Fixed data loss problems with very large numeric array indices on 64-bit + platforms (e.g. DEC UNIX). +- 2 cursor_type parameters for ifx_query() and ifx_prepare changed + to 1 (bitmask). Added a few constants for use in Informix module. +- Added php3.ini option ifx.charasvarchar. If set, trailing blanks + are stripped from fixed-length char columns. (Makes life easier + for people using Informix SE.) +- Static SNMP module which compiles with ucd-snmp 3.5.2 +- fixed imap_header & header_info from crashing when a header line + is > 1024 characters. +- Added patch for rfc822_parse_adr to return an array of objects instead + of a single object. +- Informix Online 7.x & SE 7.x support now fairly complete and stable +- Add dbase_get_record_with_names() function +- Added a special case for open_basedir. When open_basedir is set to "." + the directory in which the script is stored will be used as basedir. +- Include alloca.c in the distribution for platforms without alloca(). +- Improved stripping of URL passwords from error messages - the length of the + username/password isn't obvious now, and all protocols are handled properly + (most importantly, http). +- Copying objects that had member functions with static variables produced + undetermined results. Fixed. +- Added function lstat() and cleaned up the status functions, + added tests for file status functions (this may break on some plattforms) +- Fixed is_link() - it was returning always false. +- Fixed apache_note() - it was corrupting memory. +- New Function. void get_meta_tags(string filename); Parses filename until + closing head tag and turns all meta tags into variables prefixed with 'meta_'. + The below meta tag would produce $meta_test="some string here" + +- Generalized some internal functions in order to better support calling + user-level functions from C code. Fixes a few sporadic problems related + to constructors inside eval() and more. +- Fixed an endless loop in explode(), strstr() and strpos() in case of an + invalid empty delimiter. +- rand() now accepts two optional arguments, which denote the requested range + of the generated number. E.g., rand(3,7) would generate a random number + between 3 and 7. +- Added M_PI constant. +- Added deg2rad() and rad2deg() for converting radians<->degrees. +- ImageArc() misbehaved when given negative angles, fixed. +- Fixed a bug in ereg() that may have caused buglets under some circumstances. +- Added imap_status +- Shutdown functions, registered via register_shutdown_function(), could never + generate output in the Apache module version. Fixed. +- Brought IMAP docs into sync with acutal imap code +- imap_fetchstructure now takes in optional flags +- Fix potential core dumps in imap_append and imap_fetchtext_full +- Fix problem in SetCookie() function related to long cookies +- Add uasort() function to go along with usort (like sort() and asort()) +- Add port number to Host header as per section 14.23 of the HTTP 1.1 RFC +- Fix imap_reopen to only take 2 arguments with an optional 3rd flags arg +- Add optional 2nd argument to imap_close +- Add CL_EXPUNGE flag to imap_open() flags +- Fix 4th arg on imap_append(). It was getting converted to a long by mistake. +- Fix shutdown warning in the LDAP module +- *COMPATIBILITY WARNING* imap_fetchstructure() "parametres" object and property + name changed to "parameters" to match the documentation and to be consistent + with the rest of the API. +- Delete uploaded temporary files automatically at the end of a request +- Add upload_max_filesize and correponsing php3_upload_max_filesize directive + to control the maximum size of an uploaded file. Setting this to 0 would + completely eliminate file uploads. +- Force $PHP_SELF to PATH_INFO value when running in CGI FORCE_CGI_REDIRECT mode +- Add apache_lookup_uri() function which does an internal sub-request lookup + and returns an object containing the request_rec fields for the URI. (Yes, + you have to be a bit of a gearhead to figure this one out) +- Fix a few signed char problems causing functions like ucfirst() not to work + correctly with non-English charsets +- md5() function not binary safe - fixed + +August 15 1998 Version 3.0.3 +- Changed the name of fopen_basedir to open_basedir, to be a little more + accurate about what it does. +- Added Hyperwave module +- Added config-option (php3_)enable_dl . This enables/disables the + dl() function. In safe-mode dl() is always disabled. +- Auto-prepended files were crashing under some circumstances - fixed. +- Win32 mail fixes provided by walton@nordicdms.com +- Comparing between arrays and/or objects now generates a warning (it always + returns false, as it used to; no comparison is made) +- Fixed a bug in the syntax highlighting code, that made ending-double-quotes + appear twice under certain circumstances. +- Fix bug in filetype() function related to symlinks +- Started integrating Informix SE support to PHP configure/makefile setup. +- gdttf roundoff fixes from ellson@lucent.com +- Added initial Informix SE support files from Danny Heijl - This code still + needs to be integrated into the PHP configure/makefile setup and the code + itself needs more work. +- return in the global scope now terminates the execution of the current file. +- Added the ability to register shutdown function(s), via + register_shutdown_function($function_name). +- Clean up const warnings +- Add write support to ftp fopen wrappers +- Add strspn() and strcspn() functions +- On systems without strerror use Apache version if compiling as Apache module +- The PHP start tag was being ignored under some circumstances - fixed. +- The db, dbase and filepro functions are now Safe-Mode aware. +- Added config-option (php3_)fopen_basedir . This limits the directory- + tree scripts can open files in to . +- Fixed pg_loreadall that didn't always return all the contents in a PostgreSQL + large object. Also, doesn't pass through anything if method is HEAD. +- configure fix to create target Apache module dir +- Fix core dump in imageTTFtext() function +- Added static IMAP support +- Syntax highlighting was generating additional whitespace - fixed. +- Added ucwords. Works like ucfirst, but works on all words within a string. +- Added array_walk() - apply user function to every element of an array +- Added usort() - array sort that accepts a user defined comparison function! +- Added the ability to call user-level functions and object methods on demand + from the C source using a completely generalized, slick API function. + Miracles do happen every once in a while. +- Added constructors. Don't even squeek about destructors! :) (we mean that) +- Make pg_lowrite() binary safe +- Fixed mod_charset option in ./setup +- Fixed rewinddir() and dir()::rewind() under Win32 (they didn't work before). +- Add Win32 COM support! By-name referencing is supported using the IDispatch + interface (automation). Available functions - COM_Load(), COM_Invoke(), + COM_PropGet() and COM_PropSet(). + +July 20 1998 Version 3.0.2a +- Fix a quirk in the configuration file parser, the endless fountain of joy + and fun. +- Fix a bug in the API function add_method() that made dir() crash. + +July 18 1998 Version 3.0.2 +- Compile cleanups for *BSD +- Add support for the OpenLink ODBC Drivers +- Add PHP_SELF, PHP_AUTH_* and HTTP_*_VARS PHP variables to phpinfo() output +- Add workaround for broken makes +- Add Apache 1.3.1 support (some Apache header files were moved around) +- Added apache_note() function. +- Fix order of system libraries and detect libresolv correctly +- Fixed a bug in the Sybase-DB module. Several numeric field types were + getting truncated when having large values. +- Added testpages for unified odbc +- Fix php -s seg fault when filename was missing +- Made getdate() without args default to current time +- Added ImageColorResolve() and some fixes to the freetype support. +- Added strcasecmp() +- Added error_prepend_string and error_append_string .ini and .conf directives + to make it possible to configure the look of error messages displayed by PHP + to some extent +- Added E_ERROR, E_WARNING, E_NOTICE, E_PARSE and E_ALL constants, that can be + used in conjunction with error_reporting() + (e.g. error_reporting(E_ERROR|E_WARNING|E_NOTICE); +- Fixed a crash problem with classes that contained function(s) with default + values. +- Fixed a problem in the browscap module. Browscap files weren't being read + properly. +- Fix -L path in libphp3.module to make ApacheSSL compile without errors +- Fix StripSlashes so it correctly decodes a \0 to a NUL + +July 04 1998 Version 3.0.1 +- echo/print of empty strings don't trigger sending the header anymore. +- Implemented shift left and shift right operators (<< and >>) +- Compile fix for cc on HP-UX. +- Look for beta-version Solid libraries as well. +- Make GD module show more info in phpinfo(). +- Compile fix for NextStep 3.0. +- Fix for Oracle extension on OSF/1. +- Fix gd 1.3 bug in ImageColorAt(). +- pg_loread() hopefully handles binary data now. +- Turned off some warnings in dns.c +- Added ImageTTFBBox() and made ImageTTFText() return bounding box. +- Added constants for Ora_Bind()'s modes. +- Renamed all hash_*() routines to _php3_hash_*() to avoid clashes with other + libraries. +- Changed uodbc default LONG behaviour: longreadlen 4096 bytes, binmode 1. + The module now actually uses the php.ini settings. +- New PostgreSQL functions: pg_fetch_row(), pg_fetch_array() + and pg_fetch_object() +- Fix a segmentation fault when calling invalid functions in certain + circumstances +- Fix bug that caused link-related functions to not pay attention to + run-time safe mode setting (it was using whatever was set at compile time). +- Fix bug in exec() function when used in safe mode + +June 6 1998 Version 3.0 +- Add checkdnsrr function (check availability DNS records) +- Add getmxrr function (get MX hostnames and weights) +- Fixed bug in nl2br() function +- Fix for an RC5 related problem in the Sybase module, when dealing + with very long data types. +- Speed up string concatenation by roughly a factor of 2 +- Add escape-handling to date function +- Make base64 functions binary safe +- Add strrpos function to complement strpos function added in RC5 +- Add ltrim function (strips only at the start of string) +- Add rtrim as an alias to chop() for completeness sake +- Add trim function (similar to chop, except it strips at the start as well) +- Added 2 optional args to fsockopen function - errno and errstr +- Fixed bug in split() function related to leading matches +- Fixed problem in error_log() function (thanks to Jan Legenhausen) +- empty("0") was returning true - fixed +- Removed the old sybsql module. Use the new sybase_*() functions instead. +- Several fixes to the configuration file parser +- LDAP fixes - fixed return values on several functions + +May 23 1998 Version 3.0RC5 +- The BC math library functions now compile in by default. +- Fixed a bug in virtual() and other types of SSI's (e.g.