PHP 3.0 CHANGE LOG                                                    ChangeLog
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

October 21, 2000, Version 3.0.18
- Fixed file upload bugs (Sascha)

October 11, 2000, Version 3.0.17
- Fixed output functions (Sascha)
- Added odbc_tables() (Frank)
- Fixed htmlspecialchars/htmlentities inconsistencies (Rasmus)
- Added is_uploaded_file() (Zeev)
- Clean up htmlspecialchars/htmlentities inconsistencies (Rasmus)
- Add optional charset parameter to sybase_[p]connect (alf@alpha.ulatina.ac.cr)
- Fixed incorrect handling of 0-precision strings (e.g., %4.0s)
  in printf (Ken Coar)
- You can now call Ora_Error() without prameters to get the reason
  for a failed connection attempt. (Kirill Maximov)
- Fixed crash in OCIFetchStatement() when trying to read after
  all data has already been read. (Thies)
- Added --enable-sigchild. Use this option if you encounter
  <defunc> processes when using Oracle 8i. (Thies)
- Uncommitted outstanding OCI8 transactions are now rolled back
  before the connection is closed. (Thies)
- Improved configure checks for Oracle 8i. (Thies)
- Added imap_mime_header_decode() function (Skalski)

April 05, 2000, Version 3.0.16
- Fixed semaphore problem (Sascha)
  Reported by: ilia@astrive.com
- Fixed pcre, dbase dupe symbol problems (Sascha)
- Fixed pcre, regex, dbase relocation problems (Sascha)
- Added UCD-SNMP 4.1.x support (Sascha)
- Make it possible to set both the socket and the port at the same time
  in mysql_[p]connect() (Rasmus)
- Fixed exec() and friends and make them return last line of output 
  again.  (Rasmus)
- Added check and support for JPEG format available in gd-1.8+ (Rasmus)
- Fixed Solid 2.3 support on glibc2 systems (Stig)
- Enhanced resolution of microtime() on OS/2 by using the high resolution timer
  API. (Brian Havard)

February 25, 2000, Version 3.0.15
- Fixed crash in preg_match_all(). (Andrei)
- Backported safe_mode_protected_env_vars and safe_mode_allowed_env_vars INI
  directives from PHP 4.0 (Zeev)
- Added Matthew Herman's FTP module patch for compatibility with Microsoft
  FTP service. (Andrew Skalski)
- Fixed crash in strip_tags() and related functions.
- Fixed passthru() to no longer return any value. (Andrei)
- base64_decode() will decode POST data correct. (Thies)
  Patch submitted by: Turadg Aleahmad <turadg@wise.berkeley.edu>
- Fixed a bug in the XML module that could cause crashes (Zeev)
- Fixed a long historical bug in the API function call_user_function(),
  that could cause crashes in functions that made use of it (e.g.,
  XML module functions) (Zeev)
- Fixed possible buffer-overflow in base64_decode(). (Thies)
- Fixed possible buffer-overflow in setcookie(). (Thies)
- Added ImageWbmp() for outputting WAP's Wireless Bitmaps (markonen)
- Support for LZW-compressed GIFs with gd 1.5, gd/freetype cleanups (markonen)
- Added IMAP modified UTF-7 encode/decode routines (Andrew Skalski)
- Added .ini option to set the default charset for the default text/html mime
  type that php serves up (Rasmus)

January 11, 2000, Version 3.0.14
- Fixed broken GD autoconf check - GIF support was not detected unless libpng
  and libz were both installed on the system (Rasmus)
- Fixed safe-mode problem in popen() (Kristian)
- Fixed safe-mode problem when resource had multiple consecutive /'s (Rasmus)
- Remove written permission clause from license

January 1, 2000, Version 3.0.13
- Fixed timezone conflict on AIX (Sascha)
- Fixed mysql_errno() problem when compiled against MySQL 3.23.x (Rasmus)
- Fixed buffer overruns in iptcembed(). (Thies)
- OCI8 now returns NULL values in LONG columns correct. (Thies) 
- Check for broken apxs (Rasmus)
- explode() is now binary-safe. (Thies)
- strpos() is now binary-safe. (Thies)
- Added configure command to phpinfo() output (Stig)
- Added sketchy support for GNU recode 3.5 (Kristian)
- Added tmpfile() function (Stig)
- Fixed trim(), chop(), ltrim(), etc. to remove NULL characters as 
  well. (Colin Viebrock)
- krsort() added, although someone forgot to mention it ... (Thies)
- Upgraded regex library to alpha3.8 (Sascha)
- RFC-854 fix for internal FTP-Code. Commands have to end in "\r\n" (Thies) 
- GD-1.7.x detection (Rasmus)
- added patch to functions/mime.c so that form submit with lynx and old IE
  works properly (closes bug #2362, code by ash@ash.de)
- tempnam() now uses mkstemp() if available (Stig)
- serialize()/var_dump() now honor the precision set in php3.ini for
  double-values. (Thies)
- Added mysql_change_user() function (Rasmus)
- Fixed garbage returned at the end of certain Sybase-Columns (Thies)
  Patch submitted by: neal@wanlink.com
- XML_Parse_Into_Struct() no longer eats data. (Thies)
- Added portable access to stdio streams by using the 
  "php://stream-name" syntax (Sascha)
- Fixed zombie problem when using backquotes. eg: $x = `ls /`; (Thies)
- Locale settings are restored correctly at request end if they
  were changed in the script (Jouni)
- Fixed wrong values returned by gmmktime() and its inconsistent behaviour.
  Now gmmktime([args]) == mktime([args]) + date('Z', mktime([args])) should
  always be true (Jouni)
- Proper handling of the slightly different behavior of Fdf Toolkit 4.0 (U. Steinmann)
- Fixed LOB/Persistent-Connection related OCI8-Crash (Thies)
- Added a function for applying a gamma correction to a GD image
  Example: imagegammacorrect($im,1.8,2.2); (markonen)
- Added a function for applying a gamma correction to a HTML color value
  Example: $maccolor = gamma_correct_tag("#cccccc",2.2,1.8); (markonen)
- Ora_Fetch_Into now resets the returned array in all cases (Thies)
- Fixed SEGV in mcal make_event_object() and
  typo in mcal_list_alarms() (Andrew Skalski)
- Fixed memory leak in pdf_open_memory_image() (Uwe Steinmann)
- Added FTP support (Andrew Skalski)
- Added optional allowable_tags arguments to strip_tags(),
  gzgetss() and fgetss() to allow you to specify a string of tags
  that are not to be stripped (Rasmus)
- Fixed longstanding Apache .conf nested directive problem (Rasmus)
- OCI8 fix for fetching empty LOBs (Thies)
- OCI8 supports appending and positioning when saving LOBs (Thies)
- Added Mcal support (Mark Musone)
- OCI8 doesn't use define callbacks any longer. (Thies)
- Safe-Mode fix for oci8 savefile() function. (Thies)
- Added ldap_get_values_len function (Stig Venaas)
- Added more functions to posix module (Kristian).
- Close loophole that allowed virtual() to be used on a PHP file
  without an error (Ken Coar)
- Added versioning support for shared library (Sascha)
- Fixed bug with '%' in error_log() strings when run as Apache module (Ken Coar)
- Return false from mysql_query() and mysql_db_query() in case saving the
  result set data fails (Zeev)
- Make --with-apache --with-xml pick up Apache-bundled expat lib (Rasmus)
- Carry special Apache CFLAGS into PHP build for apxs build
  This should fix any PHP/mod_ssl compile issues (Rasmus)
- Fixed a crash that would occur if wddx_deserialize did not receive
  a valid packet (Andrey)
- Fixed sem_get() on AIX (Sascha)
- Removed --with-shared-apache to avoid problems with Apache 1.3.9 (Sascha)
- Improved speed of uniqid() by using the combined LCG and removing
  the extra usleep() (Sascha)
- Introduced general combined linear congruential generator (Sascha)
- OciFetchInto now resets the returned array in all cases (Thies)
- Fixed flushing of cached information to disk in DBA's DB2 module (Sascha)
- DiskFreeSpace() fix (Thies)
- pdflib 2.01 support (Uwe Steinmann)
- Fixed mem-leak in sysv-shm (Thies)
- Added IMSP module (Chuck Hagenbuch)
- Added gd-1.6.x PNG functions (Rasmus from drew@elysium.ltd.uk)
- Fixed [s]printf 0-padding issues (Rasmus)
- Fixed a crash bug in number_format(), in case of very large numbers (Zeev)

July 28, 1999, Version 3.0.12
- gmktime/mktime DST fix (RL and Jim)
- Add imap_search (Chuck Hagenbuch)
- Added locale support for Perl Compatible Regexp functions (Andrey)
- fix crash on invalid URLs in fopen wrappers (Sascha)
- Add support for gd1.6 (disables the ImageCreateFromGif and ImageGif
  functions because gd1.6 no longer supports GIF format files) (Jim)
- Fixed popen and pclose functions on Windows. (Jim)
- Fixed subprocess creation on Windows when used with IIS (Jim, Dave Cramer)
- Support for Swatch(r) Beat(tm), also known as Internet Time.
  Use by including "B" in the date() or gmdate() format string. (markonen)
- added gmstrftime() (like strftime() but prints out in GMT not local
  time) (David Sklar)
- A hack to allow 4bit antialiasing by modifying Freetype2 source (markonen)
- Initial Freetype2 support. You need to use the 1.2 compatibility
  API <truetype.h> for now.. (markonen)
- added strtotime() function from <nsayer@quack.kfu.com> with some
  modifications (Andrey)
- fix some problems in the socket buffering system (Sascha)
- allow subsecond precision in timeout parameter to fsockopen (Sascha)
- OCI8 - got rid of most Callback-Code (there's a bug in the Oracle 
  Client-Libraries). (Thies) 
- OCI8 - added OCISetPrefetch($stmt,$rows) for automatic prefetching of
  data. (Thies)
- make buildable on OS/2 (Brian Havard <brianh@kheldar.apana.org.au>)
- added Chad Cunningham's patches for Mac OS X Server compatibility (markonen)
- added ldap_error(), ldap_errno() and ldap_err2str() functions (kk)
- fix --with-shared-apache (Sascha)
  NOTE: Use of this is deprecated. Refer to INSTALL.DSO instead.
        Future releases do not support this option.
- support for accessing the raw POST data when its content-type isn't
  already understood by PHP (Jim)
- fix pgsql_fetch_array/pgsql_fetch_object (Sascha)
- detect missing getrlimit function (Jim Jag.)
- fix diskfreespace() on Windows post-OSR2 again (Jim)
- added Chuck Hagenbuch's imap_getmailboxes(), imap_getsubscribed(),
  and imap error queues; added preliminary support for persistent IMAP
  connections.  <askalski@chekinc.com>

June 27, 1999, Version 3.0.11
- detect missing getpgid function, fix posix_getsid (Jim)
- fix diskspacefree() on Win95 pre-OSR2 (Jim)
- fix APXS argument order (Sascha)
- decrease lexer memory footprint (see #1600) (alanc@soar.berkeley.edu, Sascha)
- add dbase_replace_record() (Greg <greg@darkphoton.com>, Sascha)
- bringing preg_split() behavior in line with split() (Andrey)
- fix APXS build on AIX (Rasmus)

June 25, 1999, Version 3.0.10
- fix base64_decode to match RFC 2045 semantics (Sascha & bfranklin@dct.com)
- fix potential segfault in tempnam() (Sascha)
- fix buffer overruns in dbase_get_record() (Sascha)
- workaround for negative 1-digit numbers not returned correct via OCI8 (Thies)
- fix APXS linking wrt to static libraries (Sascha)
- OCIExecute would sometimes return true on error (Thies)
- Made dba_open modes consistant with those from dbm_open. Specifically,
  'w' is read/write but will NOT auto-create a non-existant file.
  To do this, use 'c' which is read/write and auto-create. (Jim Jagielski)
- reverted split() to work the same way as pre 3.0.9 versions (Andrey)
- moved easter_date and easter_days to the calendar extension (Jim)
- fix VPATH APXS build process (Sascha)
- make workaround for UCD SNMP deallocate problem optional (Sascha)
  (see the documentation for a more verbose description)
- make fgetcsv() understand multi-line fields and embedded quotes (RL & Nick 
  Talbott)
- Add extension_loaded() function (Jim)
- fix URL wrapper functions to play nicely with the socket code (Sascha)
- fix persistent definitions of constants in the mcrypt module (Sascha)
- Fix gmmktime() problems (RL and Cole Tuininga)
- Added support for "localhost:/path/to/socket" syntax for mysql_connect
  (Thanks to Orion Poplawski <orion@bvt.com>.)
- Added support for file-upload arrays and put file-upload vars into
  HTTP_POST_VARS (Brian)
- fix a string allocation bug introduced in 3.0.8 in the MySQL module (Sascha)
- overhaul of Hyperwave module, mainly code clean ups, some bug fixes
- fixed a bug in preg_split() that would return nothing if nothing
  matched (Andrey)
- fixed a bug in preg_replace() that had to do with "\\" at the end
  of the replacement string (Andrey)
- open_basedir now resolves symlinks in the configuration (S. Steffann)
- added 'Z' flag to date(): timezone offset in seconds (C. Viebrock)
- added 'L' flag to date(): 1 if it's a leap year, 0 if it isn't (C. Viebrock)
- fixed 't' flag in date() (J. Ahto)
- added support for upcoming pdflib 2.0 (U. Steinmann)
- mail() on Win32 will only add Date: and From: headers if not supplied
  by the caller. (F. Kromann)

June 6 1999, Version 3.0.9
- added preg_quote() function (Andrey)
- fixed OCI8 crash for "Fetch out of sequence". (Thies)
- fix deallocation bug in dba's db2 module (Sascha)
- add "--enable-dmalloc" option (Sascha)
- added workaround for 1-digit numbers not returned correct  via OCI8 (Thies)
- removed the limit for Ora_GetColumn/Ora_Fetch_Into again. (Thies C. Arntzen)
- fix WDDX buffer bug (Sascha)
- fixed Ora_GetColumn/Ora_Fetch_Into for LONG/LONG RAW (had to put in the 64K 
  limit again). (Thies C. Arntzen)
- added easter_date() function: returns timestamp of midnight on Easter
  of the given year (valid for years 1970-2037) (Colin Viebrock)
- added easter_days() function: returns number of days after March 21 on which
  Easter falls for a given year (Colin Viebrock)
- added 't' option to date() function: returns number of days in the
  current month (Colin Viebrock)
- enabled warning when header() is used after the headers have
  been sent in in non-debug builds (Jim)
- fixed connection and cursor shutdown in oracle-module (this is a fix for
  the previous fix). (Thies C. Arntzen)
- fixed shutting down of statements in OCI8 if user logs-off. (Thies C. Arntzen)
- fixed very rare crash in shutdown of oracle-cursors. (Thies C. Arntzen)
- added Perl Compatible Regular Expressions support (Andrey Zmievski)
- fixed a couple of bugs in split()
- cpdf module now supports adding hyperlinks, annotations and outline.
  Some testing was suggesful. (U. Steinmann)
- OCI8 now supports LONG/LONG RAW > 64K (Thies C. Arntzen)
- add connection timeout to p?fsockopen (Sascha)
- fix socket buffering subsystem for blocking sockets (Sascha)
- fix fopen-wrappers.c for url's (danny)
- fix fgets() semantics (Sascha)
- fix segfault in wddx_serialize_value (Sascha)
- add support for using PostScript Type 1 fonts for text in gd.c using T1lib
  (ftp://sunsite.unc.edu/pub/Linux/libs/graphics/t1lib-0.?.tar.gz) (Jouni Ahto) 
- add bin2hex (Sascha)
- add mhash support (see http://sasweb.de/mhash/ ) (Sascha)

May 22 1999, Version 3.0.8
- OCI8 fix for RAW and LONG RAW (Binary data) - sorry currently limited to 
  64K (Thies C. Arntzen)
- Added support for pdf creation lib from FastIO, www.fastio.com
  This has not been tested, yet (U. Steinmann)
- Rewrite socket buffering subsystem (Sascha)
- Fix semaphore support on glibc-2.1 systems (Sascha)
- Add headers_sent() function which returns true if the http headers have been
  sent out already
- Ora_GetColumn and Ora_Fetch_Into can now return "LONG" and "LONG RAW"
  columns > 64K (Thies C. Arntzen) 
- Another str_replace() fix to check for a 0-length haystack (RL)
- Add range() and shuffle() functions (Jim)
- Fix glibc-2.1.1 (RH6) related crashes (ssb)
- Fix md5 on 64-bit platforms (Sascha)
- Let exit/die set exit status in CGI version (Sascha)
- Make substr() binary-safe (RL)
- OCIError can now be called without any arguments to check the error of a failed 
  OCILogon. (Thies C. Arntzen)
- added XML_Parse_Into_Struct. Parse XML without using callbacks - This makes
  life far easier when using the XML-Parser from classes etc.  (Thies C. Arntzen)
- Small fix in configure.in: doesn't try to add in Informix support anymore
  if INFORMIXDIR is set but --with-informix not specified (Jouni Ahto)
- add mcrypt module (Sascha)
- added REFCURSOR (including nested table) handling for OCI8. (Thies C. Arntzen)
- finalized new behaviour of hw_modifyobject() (U. Steinmann)
- added OCINLogon function (New-Logon) - if you need you "own-private" transaction context. (Thies C. Arntzen)
- GetImageSize now also returns the bits/sample ("bits") and samples/pixel ("cannels") -> 
  currently only works for JPEGs (Thies C. Arntzen)
- changed parameter evaluation of hw_modifyobject() (see docs) (U. Steinmann)
- fixed a sporadic crash when shutting down a request that used the ora_** calls. (Thies C. Arntzen)
- Add fgetcsv() function (RL from Nick Talbott)
- fixed mem-leak in ora_bind (Thies C. Arntzen)
- fixed length of bound variables returned from ora_bind. (Thies C. Arntzen)
- Added V1 of DBA (Sascha)
- made strtr() binary safe and faster. (Thies C. Arntzen)
- added Oracle-OCI8 persistent connections (Thies C. Arntzen)
- fixed OCIDefineByName crash. (Thies C. Arntzen)
- fixed some NULL-column related problems in OCI8-module. (Thies C. Arntzen)
- avoid stripping double slashes when fopen'ing files (Sascha)
- sql_regcase() change: only apply to alphabetic characters (Sascha)
- add snmprealwalk() (Sascha Schumann)
- fix serious bug in strftime() (Sascha Schumann)
- fix bug in ucwords() (Sascha Schumann)
- optimized fgets() and fread() (ssb)
- memory leak in operators.c fixed
- socket leak fixed (Sascha Schumann)
- Fixed the XML bug that caused garbage behind attributes
- Some Informix driver improvements.
- PUT method support (RL from mlemos@acm.org)
- Add ldap_mod_add(), ldap_mod_del() and ldap_mod_replace() (Gerritt Thomson)
- Fix parameter count problem in odbc_setoption()
- Replace broken str_replace(). The fix in 3.0.7 was bogus (Sascha Schumann)
- Really fix implode() this time.  The fix in 3.0.7 was bogus (RL)
- Added more options to the date() function: (Colin Viebrock)
  'g' - hour, 12-hour format, no leading zeros
  'G' - hour, 24-hour format, no leading zeros
  'n' - month, numeric, no leading zeros
- Make fgetss() slightly smarter (RL)
- Add strip_tags() which uses the fgetss state-machine but acts on a string (RL)
- Add CRYPT_SALT_LENGTH constant (RL)
- added set_file_buffer() (Brian Moon)

March 1 1999, Version 3.0.7
- Added pdf_put_image and pdf_execute_image
- Initial work on an ImageMagick module - doesn't do anything yet (Thies C. Arntzen)
- Make configure script detect Netscape's LDAP SDK automagically
- Fixed Oracle-OCI8 module for windows. (Thies C. Arntzen)
- Add OCIRowCount function. (Number of affected rows for update-statements)  (Thies C. Arntzen)
- Add OCIDefineByName function. (Thies C. Arntzen)
- Change the behaviour of open_basedir. It's now possible to supply more
  than one directory. open_basedir paths from parent directories are now
  automatically inherited.
- fix rand() and mt_rand() to make the ranges work correctly
- htmlspecialchars() and htmlentities() are now binary safe. (Thies C. Arntzen)
- Add extract() function.
- Oracle-OCI8 driver now supports BLOBS/CLOBS and IN/OUT binding of local php 
  variables.  (Thies C. Arntzen)
- Clean up apxs build
- Add INSTALL.REDHAT file to walk RedHat users through the install
- Added YP/NIS module from Stephanie Wehner
- Added optional second argument to mysql_fetch_array();  MYSQL_ASSOC will
  cause the resulting array to contain the associative indices only,
  MYSQL_NUM will cause the array to contain the numeric indices only (like
  mysql_fetch_row()) and MYSQL_BOTH would cause them both to be defined
  (default).
- Backport the Zend debugging memory manager into the PHP 3.0.x tree.
- Add function_exists() function.
- Add another version of WDDX module 
  (we need to pick a single implementation here)
- Fixed includes for iODBC to support both the old and the new LGPL version
- Add flock() function
- Fix implode() bug - When imploding an array that contained unset() elements
  it wasn't correctly skipping past these
- Add connection_status() function.  This returns the raw bitfield which 
  indicates whether the script terminated due to a user abort, a timeout
  or normally.  Note that if ignore_user_abort is enabled, then both the 
  timeout state and the user abort state can be active
- Add connection_timeout() function.  This one can be called in a shutdown
  function to tell you if you got there because of a timeout
- Add ignore_user_abort() function and .ini/.conf directive of same name
- Fix connection abort detection code - It should now work reliably with 
  Apache.  Also added a user-level connection_aborted() function designed to
  let people check whether the user aborted the connection in a user-level
  shutdown function.
- Add pfsockopen() function
- Improvements in FreeType support: Macintosh fonts work, and non-antialiased
  output is considerably cleaner  <mka@satama.com>
- Fixed checkdate() function, range of valid years is now 0 to 32767
- Make sure XML element attributes have the right character encoding
- hw_insertdocument() returns object id now
- Add pdf_open() warning in configure and documentation
- Add diskfreespace() function (Thies C. Arntzen)
- Added aspell support
- Iptcparse would sometimes find a wrong tag. (Thies C. Arntzen)
- Force var_dump() to output headers
- Add optional 3th parameter to ora_fetchinto. (Thies C. Arntzen)
- Serialize and var_dump no longer show array elements that 
  have been unset. (Thies C. Arntzen)
- Add IptcEmbed() function (can replace an APP13-Marker in a JPEG file) (Thies C. Arntzen)
- Add OCI8 module for Windows
- Fix bug in pdf_close() function
- Add WDDX support (see http://www.wddx.org for more info)
- Add similar_text() function
- Constructors of parent classes weren't accessible to derived classes (as
  of 3.0.6).  Fixed.
- Introduce simple regex compilation cache
- Add gettimeofday() function
- Add getrusage() function

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 <michale@utko.fee.vutbr.cz>
- 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 <mka@satama.com>).
- 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() <thies@digicol.de>.
- 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"
	<meta name="test" content="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 <on/off>. 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 <path>. This limits the directory-
  tree scripts can open files in to <path>.
- 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. <!--#exec).  Under
  certain circumstances, this used to result in random problems.
- Fixed a bug in virtual().  It was misbehaving if it was called before any
  other output.
- Added mysql.default_port, mysql.default_host, mysql.default_user and
  mysql.default_password ini-file directives.
- Improved handling of the MySQL default port.  It now honors /etc/services
  and $MYSQL_TCP_PORT.
- Fixed a crash in opening of broken ftp:// URLs, and improved error reporting
  in opening of URLs.
- Fixed several non-critical scanner issues with syntax highlighting mode and
  the <script language=php> tag.
- Fixed fseek on windows.  (windows only): fseek will not return proper results
  on files opened as text mode.  PHP uses binary mode as the default for file
  operations, but this can be overiden by fopen.  Do not open files in text
  mode and use fseek on them!
- Add strpos() function
- Added zlib module, requires zlib >= 1.0.9
- Improved the module API implementation.  Dynamic modules may now register
  persistent resources (not that it makes much sense, but at least PHP
  won't crash).  The API itself remains unchanged.
- bcmod() wasn't always behaving like modulus should behave (it was behaving
  exactly like GNU bc's % operator).  Fixed.
- Changed the Sybase-DB module to always return strings, instead of auto-typing
  result sets.  This was done for consistency with the other database modules,
  and in order to avoid overflows due to the platform-dependant limitations
  of the numeric data types of PHP.  You can turn compatability mode on using
  the sybase.compatability_mode directive in the php3.ini file.
- Fixed problems with the TINYINT field in the Sybase-CT module.
- Applied some small speed optimizations to the Sybase-DB module querying code.
- Added 'numeric' and 'type' properties to the object returned by
  sybase_fetch_field().
- The 'new' operator doesn't accept all expressions anymore.  Instead, it
  accepts a class name, or a variable reference (scalar, array element, etc).
- Add ora_numcols() function
- Add ora_do() and ora_fetch_into() functions to Oracle driver
- Add persistent connection support to Oracle driver
- Make Oracle driver clean up open connections and open cursors automatically
- Added fread() and fwrite() that properly handle binary data.
- Add Ora_ColumnSize() to Oracle code
- The string "0" means FALSE again.  This was done in order to maintain type
  conversion consistency.
- Added solid_fetch_prev() for fetching the previous result row from Solid.
- Huge integers are now automatically converted to floating point numbers
  (that have a wider range).
- Floating point numbers are now displayed using scientific notation when
  they're extremely big or extremely small.  The 'precision' php3.ini directive
  no longer designates the number of decimal digits, but rather, the maximum
  number of significant digits required.
- Added support for scientific notation for floating point numbers (e.g. 1E7)
  throughout the entire language.
- Fixed a potential/probable memory corruption problem with HEAD request
  handling.
- Using un-encapsulated strings now generates a NOTICE-level warning
  (e.g. $a = foo; instead of $a = "foo";)
- Added defined("name") function to check if a certain constant is defined
  or not.
- Support new Apache mechanism for setting SERVER_SUBVERSION
- Added PHP_OS and PHP_VERSION constants
- Added the ability to define constants in runtime!  Constants are script-wide,
  (there's no scope, once the constant is defined, it's valid everywhere).
  Syntax is define("name", $value [, $case_insensitive]).  'name' can be any name
  that is a valid variable name, *without* the $ prefix.  'value' can be
  any *scalar* value.  If the optional 'case_insensitive' parameter is 1,
  then the constant is created case-insensitive (the default is case
  sensitive).  Note:  define() is currently *NOT* supported in preprocessed
  scripts.
- Added general support for constants.  The Syslog constants (e.g.
  LOG_ERR, LOG_CRIT, etc.) should be accessed as constants from now on (that
  is, without a $ prefix).  You can still set define_syslog_variables to On
  in the php3.ini file if you want to define the various $ variables.  The
  default for this directive in the php3.ini-dist file has been changed to
  Off.
- The configuration file path variable now expands . and .. into their
  respective directories.  You can obtain the path of the php3.ini file
  that was used by printing get_cfg_var("cfg_file_path").
- Fixed a crash-recovery parser crash ($a=7; $a[3]+=5;)
- Add gmmktime() function
- Fixed a crash with implode() and empty arrays.
- Fixed a bug that, under fairly rare circumstances, caused PHP not to
  recognize if(), require() and other statements as statements, and
  to complain about them as being unsupported functions.
- Beautified php3.ini-dist and added more comments to it.  Also changed
  the behavior of the configuration file parser to be brighter about
  the various constants (TRUE/FALSE/ON/OFF etc).
- Fixed a bug in openlog() - the specified device name was being mangled.
- Memory leaks were sometimes reported erroneously - fixed.
- Improved the convertor to handle some quirks of the PHP/FI 2 parser with
  comments.
- Fixed number_format() to properly handle negative numbers, and optimized it
  a bit.
- Fixed static variables inside class member functions.  Note that using such
  static variables inside member functions usually defeats the purpose of
  objects, so it is not recommended.
- Fixed a bug in fpassthru() (the file was being closed twice).
- Added strftime().
- Add set_socket_blocking() function to control blocking on socket fd's
- The sendmail_path in php3.ini was being ignored - fixed.
- Fixed a bug with file upload, with files that contained the MIME boundary
  inside them.
- Fixed a bug with form variables of type array, with spaces in their
  index (e.g. name="foo[bar bar]").
- gd-1.3 autodetect and support
- Year 2000 compliance is now togglable from the php3.ini file.  Setting PHP
  to be y2k compliant effects the way it creates cookies, and means it'll
  NOT work with many browsers out there that are not y2k compliant!  For
  that reason, the default for this option is off.
- safe mode / fix from monti@vesatec.com
- Integrated the FreeType support in the GD extension.
- Added --with-gd=DIR and --without-gd options to configure

April 18 1998 Version 3.0 Release Candidate 4
- Auto-prepended and auto-appended files were reporting the wrong filename
  in errors and in __FILE__ - fixed.
- Fix GPC problem related to mixed scalar and array vars with the same name
- Made putenv() Apache-safe.  Environment variables may no longer leak in
  between requests.
- The trailing semicolon is no longer required in class declarations.
- Fixed a memory leak in the (array) and (object) operators under certain
  conditions.
- <script> tags weren't working unless short tags were enabled - Fixed.
- Fixed a bug in certain array indices that weren't treated as numbers
  even though they looked like numbers (e.g. "10", "20").
- Changes to support renamed API functions in Apache-1.3
- Fixed the -p and -e command line switches
- Fix a segfault when calling command line version without parameters
- Fix for feof() when used on a socket
- Fix off-by-one error in fgets() when used on a socket
- Fix bug in ImageSetPixel() (Thanks to ecain@Phosphor.net)

March 31 1998 Version 3.0 Release Candidate 3
- Tiny bugfix for magic_quotes_sybase
- Fix Apache build problems introduced in RC2
- $a["0"]==$a[0] fix
- Apache-1.3 build changes to support 100% automatic builds and shared library
  module builds.  See INSTALL file.
 
March 30 1998 Version 3.0 Release Candidate 2
- Changed the socket implementation under UNIX to not use FILE pointers, in
  order to work around the buggy Solaris libc (and possibly buggy libc's
  in other platforms).
- Fixed a bug in min() and max() with certain arrays.
- *WARNING* Move Apache 1.3 php3 file install to src/modules/php3 instead of 
  src/modules/extra.  Make sure you change your AddModule line correctly
  in your Apache Configuration file.  This change is to take advantage of 
  new Apache-1.3 configuration mechanism which makes it easier to build an
  Apache server with PHP automatically enabled.  It will also help building
  a shared library module version of PHP soon.
- Fixed a crash bug with auto-appended files.
- Made --enable-discard-path work on all Unix servers #!/path/php CGI scripts 
  should now work everywhere.  I have tested on Apache, WN and Netscape 2.0
- Made $a["123"] and $a[123] be identical.  $a["0123"] is still different,
  though.
- Added 'precision' ini directive, to set the number of decimal digits
  displayed for floating point numbers (default - 6).
- Made integer/integer divisions evaluate to floating point numbers when
  applicable (e.g., 5/2==2.5(float), but 4/2==2(int))
- Get rid of reliance on tied streams and move all socket reads and writes
  to recv/send calls
- Cleaned up head.c a bit and fixed CGI SetCookie order problem
- Changed default variable parsing order to Get-Cookie-Post (GPC)
- Fixed setup so it has all configure options and defaults.
- Added optional decimal point and thousands seperator to number_format()
  e.g., number_format(1500,2,',','.') == 1.500,00
- Fixed cgi bug in windows that prevented files from being parsed on many
  systems and servers.

March 23 1998 Version 3.0 Release Candidate
- Added support for the Raima database (ALPHA)
- Fixed a bug in persistent PostgreSQL links and the connection-string method.
- Added EXTENSION_STATUS file, that specifies the stability and status of
  every module in the distribution.
- Added optional parameters to user functions with default values, variables
  that are forced to be passed by reference and variables that can be
  optionally passed by reference.  The ini file directive
  'ignore_missing_userfunc_args' is no longer supported.
- Added fhttpd support (by Alex Belits)
- Improved performance by approximately 20-30%.
- Added mysql_error(), mysql_errno() (if available) and msql_error().
  Errors coming back from the database backend no longer issue warnings.
  Instead, use these functions to retreive the error.
- Patched count(), each(), prev(), next(), reset() and end() to work around
  the implementation side effects of unset().  As far as the users are
  concerned, this should be transparent now (even though it's slower now,
  until it's thoroughly fixed in 3.1).
- Added number_format().  number_format(2499,2)=='2,499.00'.
- error_reporting() now sets the error reporting level to the supplied
  argument, without any interpretations.
- Fixed a lookahead parser bug that occured under rare circumstances.
- Change the comparison operators to compare numeric strings as numbers.  If
  you want to compare them as strings, you can use the new C-like strcmp()
- Fixed Ora_GetColumn() bug when fetching strings
- Added Ora_ColumnName() and Ora_ColumnType()
- Preliminary LONG and LONG RAW support in Oracle extension
- Add \123 and \xAB style octal and hex escapes to "" and `` strings
- Add "-c" command line flag for specifying path to php3.ini file
- Improved list() so that elements can be skipped, for example:
  list($name,,,$realname) = explode(":",fgets($passwd_file));
- Fixed a tiny bug in the hash initialization which caused excessive use of
  memory. Report and fix by short@k332.feld.cvut.cz
- Fixed strtolower() and strtoupper() to work with 8-bit chars
- Fixed to compile and run on SunOS 4.1
- Fixed a crash in soundex() of an empty string
- Fixed parse_str() - it wasn't always defining the right variables,
  and didn't work with arrays.
- Made [m,My]SQL create/drop database functions return success status
- Fixed some memory leak/crash problems in the Adabas module
- Added each() in order to allow for easy and correct array traversing.
- Make Apache module version respect LOCALE setting
- Add support for Apache 1.3b6+ ap_config.h file
- Fixed a nasty corruption bug in eval() and show_source() that resulted in
  script termination (e.g. eval("exit();").
- Fixed a syntax highlighting problem with keywords used as variable
  names.
- Fixed a possible crash and/or file descriptor leak
- Fixed line number being off by one in #! shell style execution
- Made it possible to disable auto_prepend/append with "none" filename
- Allow safe CGI calling through #!php style scripts

March 2 1998 Version 3.0b6
- Made [s]printf handle %ld
- Changed CGI version to only open regular files as input script
- Added ignore_missing_userfunc_args directive to suppress warnings messages
  about missing arguments to user-defined functions
- Added Postgres function - pg_cmdtuples(), by Vladimir Litovka
- Disabled command line options if used as CGI
- Changed CGI version to use PATH_TRANSLATED as the script file name
- Link with solid shared library instead of static one
- Fixed a crash with functions that aren't being called correctly
- Fixed file descriptor leak in auto-prepend/append
- Imap module is usable. See README in dl/imap.

February 24 1998 Version 3.0b5
- Made the URL aware file functions be enabled by default
- Fixed an unlikely crash bug in the parser, with uninitialized array elements
  which are refered to as objects.
- Fixed several fields that were being incorrectly read in Sybase CT.
- Fix Apache-1.3 related SIGHUP problem which was preventing php3.ini from 
  getting re-read on a SIGHUP
- *** WARNING *** Downwards incompatible change:  The plus operator (+) is not
  longer overloaded as concatenation for strings.  Instead, it converts its
  arguments to numbers and performs numeric addition.
- Add Stig and Tin's bdf2gdfont script to extra/gd directory
- Added join() as an alias to implode()
- Made implode() accept arguments in the order used by explode() as well
- Made $php_errormsg local in function calls
- Fixed Apache configuration directive bugs
- Added a number of .ini directives to Apache .conf directive list
- Fixed a 'memory leak' with strtok()
- echo/print now handle binary data correctly.
- NEW now accepts any expression for the class name argument.
- Add ImageDashedLine() GD function
- Add arg_separator .ini directive so the '&' GET method separator can be
  changed to ';' for example.  Corresponding php3_arg_separator Apache .conf
  directive works as well.
- Walked around an implementation side effect of switch().  <? switch(expr) { ?>
  now works.
- Added memory caching, resulting in a significant performance boost
- Added support for for(): .. endfor; loops
- Added a new predicate - empty($var).  Returns true if $var is not set,
  or is FALSE.  Returns false otherwise.
- Added is_integer() (same as is_long()) and is_real() (same as is_double()).
- Added sizeof() as an alias to the count() function
- Added --enable-force-cgi-redirect, to prevent the CGI from working if
  someone directly accesses PHP not through Apache's CGI redirect
  (off by default).
- Fixed marking of deleted dBase records. Noticed by Simon Gornall
  <simon@oyster.co.uk>.
- Fixed fixed "%%" bug in [s]printf
- Fixed a UMR (initialized memory read) in the Oracle code
- Potential fix for mysql-related SIGPIPE problem which caused httpd to spin
- Made PHP responsive to the Apache link status (stop executing if the link
  dies).
- Fixed a crash bug with StrongHold and secure pages
- Fixed StrongHold installation
- Optimized the function call sequence a bit.
- Fixed Sybase/CT date/datetime/money fields work to correctly.
- Fixed Apache module startup problems - php3_module_startup should only be
  called once.
- Fixed ord() with characters >127
- Fixed bug in file_exists() function
- Fixed stripslashes() to remove the escaping quote (instead of backslash)
  in case magic_quotes_sybase is true.
- Also make echo and print automatically remove trailing decimal zeros.
- Added htmlentities(), currently handling only ISO-8859-1 entities
- "0" is no longer considered false, the only string which is false is the
  empty string "".
- Added 'true' and 'false' keywords
- Added 'xor' (logical exclusive or)
- Automatic conversion from double to string removes decimal trailing zeros.
- Added arsort() and rsort() to sort in descending order.
- Turned on "XLATOPT_NOCNV" by default for uODBC/Solid.
- Added support for a port number in the mysql_(p)connect() functions
- Fixed a file descriptor leak in the configuration parser.
- Fixed a few buglets with syntax highlighting with certain language keywords
- Added functions to control minimum severity level of Sybase messages to
  display.
- Added highlight_string() - behaves like highlight_file(), only instead
  of highlighting a file, it syntax highlights the contents of its
  argument.
- Renamed show_source() to highlight_file().  show_source() is still
  supported for downwards compatability.
- Fixed a bug in class inheritence - member functions with upper case
  letters in their names couldn't be redefined.
- Made chown(), chgrp() and chmod() return TRUE/FALSE instead of 0/-1.

February 02 1998 Version 3.0b4
- Fixed a segfault bug in one of the unified ODBC error messages.
- Set default file modes to binary on Win32 (solved a lot of bs)
- Fixed file copy on Win32
- MIME file uploads fixed on Win32
- Added contributed icons by Colin Viebrock (undex extra/icons)
- Fixed the debugger enough to call it "beta code".
- Fixed some leaks in the Oracle module, tidied up the code a bit.
- Added __FILE__ and __LINE__ which evaluate to the currently parsed file
  and currently parsed line respectively.
- Added ImageColorAt(), ImageColorSet(), ImageColorsForIndex(), and
  ImageColorsTotal() to allow manipulating the palette of GIF images.
- Rename '--enable-url-includes' option to '--enable-url-fopen-wrapper' to
  better describe what it does, and pay attention to the setting.
- Added optional parameter to the file(), readfile()  and fopen() functions
  to look for files located in the include path.
- Fixed bug that allowed the file() and readfile() to open files in the
  include path inadvertantly.
- Fixed a (documented) bug in printf()/sprintf() with hard limited strings
  and alignment (e.g. %-.20s).
- Optimized several quoted string routines.
- Added error_log ini directive to select where errors get logged when
  log_errors is turned on or the error_log() function is used.
- Added the ability to direct errors to log files instead of or in addition
  to the script output.  Use the new display_errors and log_errors
  php3.ini directives.
- Made environment variables uneraseable by POST/GET/Cookie variables.
- Fixed a bug in the elseif() construct.  The expression was being evaluated
  even if a previous if/elseif already evaluated to true and got executed.
- Fixed a bug in the exit code parameter of system()
- Tighten up all exec() related functions in safe mode
- Added error_log() function to log messages to the server error log, or
  stderr for the CGI version.
- Added support for a general memory limit of scripts.
- Fixed a segfault bug that occured under certain circumstances with shell
  escapes ($foo = `...`)
- Made keywords be valid property names of objects.
- Fixed a segfault bug when creating new objects of an unknown class.
- Fixed a problem with the maximum execution time limit, that may have
  prevented this feature from working on certain platforms.
- PHP would now warn you with E_NOTICE about unknown escape characters,
  e.g. "\f".  It would still be considered as a backslash followed by f,
  but the proper way of writing this is "\\f" or '\f'.
- Added support for ${...} inside encapsulated strings.  Supported:  ${foo},
  ${foo[bar]}, ${foo[0]}, ${$foo[$bar]}, ${$foo->bar} and ${$foo}
- Fixed a bug in automatic persistent link reconnect of the Sybase/DB module.
  Thanks to Steve Willer for finding that 'stealth' bug!
- Fixed a crash bug in the GET/POST/Cookie parser in case of regular
  and array variables with the same name.
- Added round() function.
- Can't use encapsed strings as variable names anymore, ie. $"blah blah".
- Fixed bug in gethostby*() functions that resulted in a core dump.
  (Noticed by torben@coastnet.com.)
- Fixed bug in dbase_get_record that prevented number and date fields
  from being properly decoded. (Thanks again to colins@infofind.com.)
- Make dbase_get_record include a 'deleted' field that indicates whether
  that record had been marked for deletion.
- Fixed bug in dbase library that stomped on the deleted flag of the first
  record in the file if it was set. (Thanks to colins@infofind.com.)
- Fixed putenv() to not report a memory leak and possibly prevent a bug
  from that memory being freed.
- Added setlocale()
- Added pg_fieldisnull() (by Stephan Duehr)
- Changed pg_exec() to always return a result identifier on succees
- Solid linking fixes (tries to find the right library)
- Fixed a but with date() and the 'w' element.
- Tried to eliminate unimportant memory leak notifications.
- Made min() and max() backwards compatible and able to handle doubles.
- Add fgetc() function
- Fixed bug in getmyuid(), getmyinode() and getlastmod(). Thanks to
  khim@sch57.msk.ru for pointing this out.
- Fixed http:// URL includes with no path specified send request for /.
- Added GetAllHeaders() (Apache-only)
- Added workaround that made the Image text functions 8-bit clean
- Made snmp internally compilable for Win32 (not the unix one though),
  only adds 2k to binary size, so no reason not to have it there.
- Fixed ldap loading on Win32
- Fixed MySQL Info function on Win32 platform
- Fixed compilation of syntax highlighting mode

January 17 1998 Version 3.0b3
- Added mysql support under windows ;)  happy happy joy joy
- Fixed dbase.dll for Win32 to actualy load now.
- Enhanced the convertor to recognize ?> as a php-close-block as well.
- Fixed potential SetCookie() core dumps
- Changed print to be an expression instead of a statement.  That means you can
  now do stuff like foobar() or print("Unable to foobar!").  echo has NOT been
  changed.
- Removed the flex optimization flags to reduce the size of the scanner
- Added memory leak logging into apache log files (apache module only)
- Fixed a nasty bug in one of the internal stacks.  This may have caused
  random crashes in several occassions.
- Fixed bug in ImageGif() making it hang sometimes
- Added ImageLoadFont(), ImageFontWidth() and ImageFontHeight()
- error_reporting() now returns the old error reporting level
- Fixed url includes/opens not working under Win32
- Fixed errorneous handling of multipart/form-data input
- Added rawurlencode(), rawurldecode() and changed urlencode() and urldecode() 
  a bit too.
- Fixed a bug in [s]printf, sign was forgotten for doubles.
- Fixed a segfault bug in pg_fieldprtlen(), and made it accept field names
  in addition to field offsets.
- Made the setup script a little more user-friendly.
- Added is_long(), is_double(), is_string(), is_array() and is_object()
- Fixed a bug in freeing of mSQL results.
- Improved pg_exec() to properly return true or false with queries that don't
  return rows (i.e. insert, update, create, etc)
- Added get_cfg_var() to enable checking cfg file directives from within
  a script.
- Fixed a bug with urlencode() and characters 0x80-0xff
- Changed the behaviour of ereg_replace to more intuitive.  The
  backslashes other than valid existing back references in the second
  argument are no more evaluated as escape sequences.
- Fixed a bug in the configuration file loader and safe mode.
- Fixed a bug with configuration variables taken from the environment.
- Added <script language=php> </script> as PHP open/close tags, to allow
  the use of editors such as Microsoft Frontpage.
- Fixed a bug in the default php3.ini directory - it wasn't defaulting to
  /usr/local/lib properly.
- Added support for \r\n line endings
- Fixed a bug that may have prevented POST method variables from working 
  with certain scripts when using the CGI version.
- Convertor:  Added support for single-quoted strings
- Fixed segfault bug in the Adabas module, with queries that don't return
  rows (update, insert, etc).

December 22 1997 Version 3.0b2
- Changed variable type conversions that do not specify base to always use
  base 10.  "010" is no more 8, it is 10.  Use intval ($x, 0) to get C-style
  octal and hex numbers recognized.
- Fixed a possible segfault bug in several functions, when using the concat
  operator and possibly other operators/functions.
- # is no longer accepted as a comment in php3.ini.  Use ; instead.
- Added browscap support
- Configuration file directives are now case-sensitive
- Fixed msql_tablename() and msql_dbname()
- Added a PHP/FI 2.0 -> PHP 3.0 convertor
- Added support for shell/perl-style single quotes
- Added support for execution of external programs using backquotes ($a=`ls -l`)
- fixed mail() on windows, also fixed memory leaks in mail on windows
- added sendmail_from to handle return route on windows
- Changed the way the config file is searched.  The file name is now
  php3.ini (hardcoded), and it'll be looked for in:  local directory, $PHPRC
  and builtin path designated by ./configure under UNIX or Windows directory 
  under Windows.
- Fixed ereg_replace replacing empty matches and a one off buffer overflow
- Fixed File upload on windows platform
- Fixed a bug that caused 'HTTP/1.1 100 Continue' messages with 
  Internet Explorer 4.0 and certain scripts that receive POST variables
- Get/POST/Cookie data variables are from now *ALWAYS* strings.  If you want
  to use them in integer/real context, you must explicitly change their types.
  This was done in order to avoid possible loss of data when doing these
  conversions automatically.
- Variables named as keywords are now allowed (e.g. $function, $class, etc)
- Fixed a problem with msql() and mysql() with NULL fields
- Fixed a segfault bug with class declarations
- Fixed bugs with FOR loops and include() from within eval()
- Changed include() to be executed conditionally.  PHP-3.0 efficient
  unconditional include is now require()

December 08 1997 Version 3.0b1
- Switched to public beta test phase
- Generalized unset() and isset() to work on any type of variables, including
  specific array indices or object properties (e.g., unset($a[4]) now works).
- Added support for object references inside encapsulated strings
  (for example, 'echo "Username:  $user->name"' now works)
- Added arbitary precision math support (basic operations with
  unlimited range numbers, and support for unlimited decimal digits)
- Apache module can now handle preprocessed scripts (by using:
	AddType application/x-httpd-php3-preprocessed .php3p
  in the Apache configuration)
- Made settype() pass its first parameter by value.  Improved it to be able
  to convert to arrays and objects (originally by Steve Willer)
- Implemented CPU time limit on scripts when setitimer() is available
- Computed field names in the Sybase/CT and Sybase/DB modules are now named
  computed, computed1, computed2, ...
- Added Sybase/CT client/server message handlers and updated the Sybase/DB ones
- Made the regexp function automatically take arguments by reference
  when necessary
- Added builtin support for auto append and prepend in the parser level
- Improved the Sybase/CT sybase_query().  Should be more stable now, and
  hopefully work with a wider range of queries.  It's difficult to work
  without docs, though, so it may still not be 100% right...
- Changed error messages to show error type, file and line with bold
- Added support for autoprepend and autoprepend
- Added some more warning flags if gcc is used

December 03 1997 Version 3.0a4
- Improved the internal functions API - no need to explicitly pass
  parameters by reference to internal functions that specifically
  require them, e.g. sort(), ksort(), reset(), count(), etc.
  This is *STILL* downwards compatible with the previous alphas,
  in the sense that you can explicitly pass the arguments by reference
  if you want to.
- use srandom/random instead of srand/rand if available
- Added [m,My]sql_listfields() for downwards compatability
- -p now replaces .php3 extension with .php3p (otherwise it adds .php3p)
- Added C++ style comments (// comment)
- Fixed # commenting to terminate at a close PHP tag
- Added \0 back reference for full string match to *reg*_replace and
  added backslash escaping to replace string
- Fixed a few bugs in the Sybase DB-library module.
- Added Sybase CT-library support.  It should be considered experimental.
  Syntax is identical to the one of the DB-library.  Allows people to
  connect to MS-SQL servers from Linux without having to pay for a
  library!
- Beautified phpinfo()
- Add ImageColorClosest() and ImageColorExact() GD functions
- Make all .ini directives work as Apache .conf directives as well
- Added PHP2-like File() function with PHP3 URL support
- Upgraded the Sybase interface.  It's practically MySQL compatible now!
  Among other things, added sybase_fetch_array() and sybase_fetch_object().
- Fixed problem in multi dimensional array handling and self modifying
  operators (+=, -=, etc).
- Safe Mode file open implementation
- SVR3 portability problem fix

November 23 1997 Version 3.0a3
- Made the global statement behave like PHP 2 with undefined variables
- Added msql_fetch_object() and msql_fetch_array()
- Switched between the 1st and 2nd parameters to explode(), so that it acts
  like split()
- Fixed passthru(), exec() and system() functions
- Implemented second optional parameter to intval() to specify conversion base
  (The default is to assume you want to do a base 10 conversion.)
- Implemented SQL safe mode for MySQL
- Read UploadTmpDir from php3.ini instead of apache conf files
- Added mysql_fetch_object() and mysql_fetch_array()
- Changed function->old_function.  function is now an alias to cfunction.
- Split the magic_quotes directive to get/post/data and other
- Added generic copy() function
- Added a $GLOBALS[] array, which contains all global variables
- Fix broken getimagesize() function
- Made mysql_fetch_field() and msql_fetch_field() optionally accept a 2nd argument
- Fixed mysql_data_seek() and msql_data_seek()
- Changed list assignment to list(...) and array init to array(...)
- Made <?php_track_vars?> work
- cgi when not in debug mode uses regular malloc(), free() functions now
- Added preliminary support for perl-style list assignments
- Fixed a bug in mysql_result() and msql_result() when specifying table
- renamed internal error-handling function and levels
- Added basename and dirname functions similar to sh counterparts
- Added base64_encode() and base64_decode()
- Support Basic authorization for http url includes
- Added parse_url() function to extract url components
- Made it possible to use anonymous ftp on URL includes
- Fixed url includes to handle different URLs better
- Fixed mysql_field*() functions
- Made mysql_connect() smarter, after a mysql_close() (applies to msql and pgsql too)

November 6 1997 Version 3.0a2
- Fixed a segfault bug caused by non-persistent connect in [m,My,Postgres]SQL modules
- Fix command line argument handling
- Made empty array list assignments work ($a=({});)
- Made '$' escaping optional when a variable name parsing isn't possible
- Added support for mysql_[p]connect(host) and mysql_[p]connect(host,user)
- New layout in phpinfo()
- Update Oracle extension to use php3_list functions
- Add includepath support
- Add #!php shell script escape support
- Change name of CGI/command line version from php3.cgi to php
- Add SNMP extension
- show_source() support
- Parsing of command-line args for CGI version
- Support for backreferences in ereg_replace
- Support for hexadecimal numbers directly at the scanner level
- Support octal numbers directly at the scanner level
- Fixed problem with huge html files (with little or no php code)
- Fix eval() empty string argument core dump
- renamed 'install' to 'setup' to be more accurate and avoid name conflict
- Fixed Oracle compilation
- Fixed mSQL 1.0 compilation
- Fixed a problem in the mSQL, MySQL and PostgresSQL drivers and NULL fields.
- Fixed the GLOBAL statement to be able to declare an array.

October 29 1997 Version 3.0a1
- Start with excellent new parser from Andi and Zeev
