diff --git a/BUGS b/BUGS new file mode 100644 index 0000000000000..8966692d58389 --- /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 0000000000000..b3b9d8bea56cd --- /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 0000000000000..477cad33c96ef --- /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 0000000000000..a43ea2126fb6b --- /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 0000000000000..19cc505032e37 --- /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 0000000000000..76e826b96b077 --- /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.