summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BUGS11
-rw-r--r--CHANGES624
-rw-r--r--CODING_STANDARDS149
-rw-r--r--COPYING339
-rw-r--r--CREDITS176
-rw-r--r--ChangeLog859
-rw-r--r--EXTENSION_STATUS54
-rw-r--r--FUNCTION_LIST.txt538
-rw-r--r--INSTALL159
-rw-r--r--LICENSE64
-rw-r--r--Makefile.in1078
-rw-r--r--README.QNX57
-rw-r--r--README.WIN3259
-rw-r--r--TODO100
-rw-r--r--WISHLIST17
-rw-r--r--WISHLIST-3.155
-rw-r--r--acconfig.h261
-rw-r--r--aclocal.m4417
-rw-r--r--apMakefile.libdir4
-rw-r--r--apMakefile.tmpl77
-rw-r--r--apidoc.txt492
-rw-r--r--bison.simple705
-rw-r--r--build-defs.h.in85
-rw-r--r--calendar.mak244
-rw-r--r--config.guess743
-rw-r--r--config.h.in489
-rw-r--r--config.sub939
-rw-r--r--configure.in1965
-rw-r--r--control_structures.h46
-rw-r--r--crypt.mak204
-rw-r--r--cvsusers62
-rw-r--r--dbase.mak234
-rw-r--r--dbm.mak201
-rw-r--r--ext/ereg/regex/COPYRIGHT20
-rw-r--r--ext/ereg/regex/Makefile.in141
-rw-r--r--ext/ereg/regex/README32
-rw-r--r--ext/ereg/regex/WHATSNEW92
-rw-r--r--ext/ereg/regex/cclass.h31
-rw-r--r--ext/ereg/regex/cname.h102
-rw-r--r--ext/ereg/regex/debug.c242
-rw-r--r--ext/ereg/regex/engine.c1019
-rw-r--r--ext/ereg/regex/main.c510
-rw-r--r--ext/ereg/regex/mkh76
-rw-r--r--ext/ereg/regex/regcomp.c1546
-rw-r--r--ext/ereg/regex/regerror.c124
-rw-r--r--ext/ereg/regex/regex.3502
-rw-r--r--ext/ereg/regex/regex.7233
-rw-r--r--ext/ereg/regex/regex.dsp106
-rw-r--r--ext/ereg/regex/regex.dsw29
-rw-r--r--ext/ereg/regex/regex.h79
-rw-r--r--ext/ereg/regex/regex.mak304
-rw-r--r--ext/ereg/regex/regex2.h138
-rw-r--r--ext/ereg/regex/regexec.c140
-rw-r--r--ext/ereg/regex/regfree.c37
-rw-r--r--ext/ereg/regex/split.c316
-rw-r--r--ext/ereg/regex/tests475
-rw-r--r--ext/ereg/regex/utils.h22
-rw-r--r--ext/snmp/winsnmp.c228
-rw-r--r--filepro.mak194
-rw-r--r--foo9
-rw-r--r--foo23
-rw-r--r--foo343
-rw-r--r--foo441
-rw-r--r--footer7
-rw-r--r--gd.mak214
-rw-r--r--getopt.c171
-rw-r--r--getopt.h9
-rw-r--r--header29
-rw-r--r--hyperwave.mak214
-rw-r--r--imap4.mak194
-rw-r--r--install-sh238
-rw-r--r--internal_functions.c171
-rw-r--r--ldap.mak194
-rw-r--r--libphp3.module.in7
-rw-r--r--ltconfig1064
-rw-r--r--ltmain.sh1813
-rw-r--r--main.h72
-rw-r--r--main/alloca.c505
-rw-r--r--main/config.w32.h294
-rw-r--r--main/configuration-parser.y415
-rw-r--r--main/configuration-scanner.l170
-rw-r--r--main/fopen_wrappers.c1000
-rw-r--r--main/fopen_wrappers.h90
-rw-r--r--main/internal_functions_registry.h57
-rw-r--r--main/logos.h805
-rw-r--r--main/main.c2222
-rw-r--r--main/php.h485
-rw-r--r--main/php3_compat.h80
-rw-r--r--main/php_ini.c148
-rw-r--r--main/php_ini.h48
-rw-r--r--main/php_version.h1
-rw-r--r--main/safe_mode.c156
-rw-r--r--main/safe_mode.h7
-rw-r--r--main/snprintf.c935
-rw-r--r--main/snprintf.h56
-rw-r--r--main/win95nt.h74
-rwxr-xr-xmakeall.bat13
-rwxr-xr-xmakedist126
-rwxr-xr-xmakeparser.bat4
-rw-r--r--mod_php3.c643
-rw-r--r--mod_php3.h107
-rw-r--r--msql.mak194
-rw-r--r--msql1.mak212
-rwxr-xr-xmtparser.bat4
-rw-r--r--mysql.mak197
-rw-r--r--objects7
-rw-r--r--output.c226
-rw-r--r--output.h18
-rw-r--r--php3.ini-dist243
-rw-r--r--php3_realpath.c290
-rw-r--r--php3_realpath.h41
-rw-r--r--php3_sprintf.c54
-rw-r--r--php3_threads.c79
-rw-r--r--php3_threads.h33
-rw-r--r--php3extra.dsw41
-rw-r--r--php3sapi.dsw89
-rw-r--r--php4.dsp660
-rw-r--r--php_custom_build.mak269
-rw-r--r--press-release-3.0.txt47
-rw-r--r--recurse21
-rw-r--r--regex/COPYRIGHT20
-rw-r--r--regex/Makefile.in141
-rw-r--r--regex/README32
-rw-r--r--regex/WHATSNEW92
-rw-r--r--regex/cclass.h31
-rw-r--r--regex/cname.h102
-rw-r--r--regex/debug.c242
-rw-r--r--regex/engine.c1019
-rw-r--r--regex/main.c510
-rw-r--r--regex/mkh76
-rw-r--r--regex/regcomp.c1546
-rw-r--r--regex/regerror.c124
-rw-r--r--regex/regex.3502
-rw-r--r--regex/regex.7233
-rw-r--r--regex/regex.dsp106
-rw-r--r--regex/regex.dsw29
-rw-r--r--regex/regex.h79
-rw-r--r--regex/regex.mak304
-rw-r--r--regex/regex2.h138
-rw-r--r--regex/regexec.c140
-rw-r--r--regex/regfree.c37
-rw-r--r--regex/split.c316
-rw-r--r--regex/tests475
-rw-r--r--regex/utils.h22
-rw-r--r--request_info.c259
-rw-r--r--request_info.h62
-rw-r--r--setup519
-rw-r--r--snmp.mak194
-rw-r--r--stamp-h.in0
-rw-r--r--test.php416
-rw-r--r--test.pl34
-rw-r--r--test_class_inheritance29
-rw-r--r--testarray21
-rw-r--r--testarray.pl5
-rw-r--r--testarray25
-rw-r--r--testarray2.pl3
-rw-r--r--testclassfunc10
-rw-r--r--testcom9
-rw-r--r--testfe21
-rw-r--r--testfunc36
-rw-r--r--testfunc.pl20
-rw-r--r--testfunc219
-rw-r--r--testfunc2.pl22
-rw-r--r--testfuncref8
-rw-r--r--testinclude5
-rw-r--r--testobj9
-rw-r--r--tls.c113
-rw-r--r--tls.h208
-rw-r--r--win32/flock.c83
-rw-r--r--win32/flock.h11
-rw-r--r--win32/grp.h31
-rw-r--r--win32/param.h16
-rw-r--r--win32/pwd.c79
-rw-r--r--win32/pwd.h57
-rw-r--r--win32/readdir.c111
-rw-r--r--win32/readdir.h37
-rw-r--r--win32/sendmail.c511
-rw-r--r--win32/sendmail.h46
-rw-r--r--win32/signal.h4
-rw-r--r--win32/syslog.h73
-rw-r--r--win32/time.c156
-rw-r--r--win32/time.h40
-rw-r--r--win32/unistd.h1
-rw-r--r--win32/wfile.c17
-rw-r--r--win32/wfile.h16
-rw-r--r--win32/winutil.c29
-rw-r--r--win32/winutil.h1
-rw-r--r--win32/wsyslog.c128
-rw-r--r--zlib.mak194
189 files changed, 43488 insertions, 0 deletions
diff --git a/BUGS b/BUGS
new file mode 100644
index 0000000..8966692
--- /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 0000000..b3b9d8b
--- /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:
+
+ <?echo $title;>
+
+ You should write:
+
+ <?echo $title;?>
+
+ PHP3 also includes support for a longer-form start tag that is
+ XML-compliant:
+
+ <?php echo $title;?>
+
+ The ability to use the short start tag ('<?') can be turned on and
+ off using the short_tags() function. Whether it is enabled or not by
+ default is a compile-time option (normally set to enabled by default).
+
+
+[2] Semicolons in if/elseif/else must be replaced with colons.
+
+ For example, the equivalent of:
+
+ if (expr);
+ statements
+ ...
+ elseif (expr);
+ statements
+ ...
+ else;
+ statements
+ endif;
+
+ in PHP 3.0 would be:
+
+ if (expr):
+ statements
+ ...
+ elseif (expr):
+ statements
+ ...
+ else:
+ statements
+ endif;
+
+ Note that the endif is followed by a semicolon and not a colon even in
+ PHP 3.0, which marks the end of the entire IF sentence.
+
+ Also note that the implementation of the colon-mode and curly-braces
+ mode in PHP 3.0 is identical, one isn't buggier than the other (note
+ that I'm not saying they're not buggy, though :)
+
+
+[3] Semicolons in while loops must also be replaced with colons.
+
+ For example, the equivalent of:
+
+ while (expr);
+ statements
+ ...
+ endwhile;
+
+ in PHP 3.0 would be:
+
+ while (expr):
+ statements
+ ...
+ endwhile;
+
+ Note that the endwhile is followed by a semicolon and not a colon even
+ in PHP 3.0, which marks the end of the WHILE sentence. As with the IF
+ statement, the implementation of the colon-mode and curly-braces mode
+ in PHP 3.0 is identical, one isn't buggier than the other.
+
+ Also note that failing to change the semicolon to a colon can result in
+ scripts that get stuck in the while loop because the loop-condition never
+ changes.
+
+
+[4] $foo[0] is no longer identical to $foo.
+
+ In PHP/FI 2.0, a side-effect of the implementation caused $foo[0] to be
+ identical to $foo. This is not the case in PHP 3.0.
+
+
+[5] Expressions determine their types differently.
+
+ The way expressions are evaluated has changed radically in PHP 3.0.
+ Expressions are no longer given the type of the left argument, but are
+ assigned types taking both types into account, and regardless of which
+ is on the left side and which is on the right side. On simple scripts
+ that should probably not effect you, but if you've relied on this fact
+ (even without realizing you do) it may change the way your scripts work.
+ Consider the next example:
+
+ $a[0]=5;
+ $a[1]=7;
+
+ $key = key($a);
+ while ("" != $key) {
+ echo "$key\n";
+ next($a);
+ }
+
+
+ In PHP/FI 2.0, this would display both of $a's indices. In PHP 3.0, it
+ wouldn't display anything. The reason is that in PHP/FI 2.0, because the
+ left argument's type was string, a string comparison was made, and indeed
+ "" does not equal "0", and the loop went through. In PHP 3.0, when a
+ string is compared with an integer, an integer comparison is made (the
+ string is converted to an integer). This results in comparing atoi("")
+ which is 0, and $key which is also 0, and since 0==0, the loop doesn't
+ go through even once. The fix for this is simple, by replacing the
+ while statement with:
+
+ while ("" != stringval($key)) {
+
+ This would first convert the integer 0 to a string "0", and then
+ compare "" and "0", which are not equal, and the loop would go through
+ as expected. As mentioned later, casting operators are supported in
+ PHP 3.0 for a quicker and more readable way of changing variables'
+ types. For example, you could use:
+
+ while ("" != (string)$key) {
+
+
+[6] The structure of error messages has changed.
+
+ Although the error messages are usually more accurate, you won't be shown
+ the actual line of text and actual place in which the error occured.
+ You'll be supplied with the line number in which the error has occured,
+ though.
+
+
+[7] The format string argument to echo is no longer supported.
+
+ Use printf(format,arg1,arg2,arg3,...) instead (unlimited arguments).
+
+
+[8] The use of read-mode $array[] is no longer supported.
+
+ That is, you cannot traverse an array by having a loop that does $data =
+ $array[]. Use current() and next() instead. Also, $array1[] = $array2
+ does not append the values of $array2 to $array1, but appends $array2
+ as the last entry of $array1 (see the multidimensional array support).
+
+
+[9] Apache versions older than 1.2 are not supported anymore.
+
+ The apache module requires apache 1.2 or later (1.3-beta is supported).
+
+
+[10] Indirect references inside quoted strings
+
+ PHP2-style indirect reference inside quoted strings is no longer
+ supported. That is, if $foo="bar", and $bar="abc", in PHP2,
+ "$$foo" would print out "abc". In PHP3, this would print
+ "$bar" (the contents of $foo is replaced with "bar").
+ To use indirect reference in PHP3 inside quoted strings, you should use
+ the new notation: "${$foo}". The standard $$foo notation will work
+ outside of the quoted string.
+
+[11]
+ Some functions have changed names, are missing, or have been deprecated
+ by other functions
+
+ As a whole new rewrite, written by many more people and supporting many
+ more APIs than it's predecessor, there's a good chance some of the functions
+ you're used to from PHP/FI 2 aren't available in release 3, or have changed
+ names. Many functions that do exist behave a bit differently, mainly
+ because they return different values for errors (false) but also for other
+ reasons. We can't list all of these functions here, simply because drawing
+ a full comparison between the function sets of the two versions is way too
+ much work. If a converted PHP/FI 2 script doesn't work for you, nothing
+ can replace the good old human eye going over the code, doublechecking
+ with the online manual that each function still does what you expected it
+ to do.
+
+[12] Other incompatibilities.
+
+ It's not too unlikely that other documented behavior of PHP2 has changed
+ in this release. If you think you've found an example, please mail
+ us at php-dev@php.iquest.net. Even if you've found an undocumented
+ feature of PHP2 that stopped working in PHP3, we'd like to know about it
+ (although it's more than likely that it will not be supported).
+
+
+
+------------------------------------------------------------------------------
+
+
+New Language Features
+=====================
+
+[1] Expressions
+
+ PHP 3.0 includes a rich implementation of expressions, much more advanced
+ than this of 2.0. Just about any complex C-like or perl-like expression
+ would work. Support was added for assignment operators (+=, -=, *= etc),
+ pre and post increment/decerement (e.g. $i++, ++$i) and the questionmark
+ operator ( (expr?expr:expr) ). Every assignment is now an expression
+ with a value, which means stuff like $a = $b = $c = $d = 0; would work.
+ It is difficult to describe the power of expressions within a few lines
+ of text, but if you're familiar with them, you probably get the picture.
+
+
+[2] for loops are now supported.
+
+ for loops were fairly difficult to implement (in fact, we didn't find
+ any parallel interpreter that supports for loops anywhere (no, perl is
+ not an interpreter)). The bottom line is that for loops work, and are
+ around 5% slower than comparable while loops (that may vary), but often
+ they're much nicer.
+
+ The syntax is identical to the one of C:
+
+ for (expr; expr; expr) statement;
+
+ or
+
+ for (expr; expr; expr) { statements ... }
+
+ The first expression is executed the first time the loop is encountered,
+ the loop is run as long as the second expression is evaluated as TRUE,
+ and after each iteration, the 3rd expression is evaluated.
+
+ Colon-mode FOR loops are also supported:
+ for (expr; expr; expr):
+ statements
+ ...
+ endfor;
+
+
+[3] do..while(expr) loops are now supported.
+
+ Like with its C parallel, the statements inside a do..while loop are
+ run once the first time the loop is encountered, and then as long as
+ the expression evaluates as true.
+
+ For example:
+
+ do {
+ statements;
+ } while ($i++ < $max);
+
+
+[4] break and continue statements are now supported inside loops.
+
+ You can break out of loops, or continue to the next iteration of the
+ loop using these statements. A special feature of PHP is the ability
+ to specify an expression argument to break or continue, which specifies
+ how many loops you want to break out from or continue to. For example:
+
+ for ($i=0; $i<10; $i++) {
+ for ($j=0; $j<10; $j++) {
+ if ($j>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 0000000..477cad3
--- /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 0000000..a43ea21
--- /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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ 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.
+
+ <signature of Ty Coon>, 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 0000000..19cc505
--- /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 <chuck@osmos.ml.org>
+ 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 0000000..76e826b
--- /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 <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
diff --git a/EXTENSION_STATUS b/EXTENSION_STATUS
new file mode 100644
index 0000000..48be544
--- /dev/null
+++ b/EXTENSION_STATUS
@@ -0,0 +1,54 @@
+The core of PHP 3.0 is considered to be stable at this time. However, some of
+the modules that are bundled with it are still undergoing development, or
+contain known bugs. The purpose of this file is to document the status of
+each module (extension). Patches to unstable modules will be available through
+the CVS, and through periodic maintenance releases.
+
+Stability scale:
+Rock solid - We believe it's safe to base a production site on it.
+Stable - It should be safe to base a production site on it.
+ Isn't rated as rock-solid because it contained problems
+ in the not-so-far past, or doesn't have enough users
+ to test it to know it's rock solid.
+Beta - This module probably contains bugs, sometimes even known
+ bugs. You can give it a try and there's a good chance
+ it'll work fine, but it might not be a good idea to base
+ a production site on it.
+Alpha - This module is in initial development steps. Don't trust
+ it, play with it at your own risk.
+Deprecated - This module is only available for downwards compatability,
+ and will not be supported in any way. The code quality
+ is usually around the Beta status.
+
+The standard disclaimers apply, that is, if a rock-solid module blows up on
+you and ruins your site, nobody in the PHP development team is responsible.
+We'll probably try to help, though.
+
+
+Extension Name Status Comments
+-----------------------------------------------------------------------------
+DBM Rock Solid That relies on a working DBM library.
+ The flatfile support is probably not
+ as stable.
+MySQL Rock Solid
+mSQL Rock Solid
+Sybase DB Stable
+Sybase CT Stable
+BC Math Rock Solid Arbitary precision math library
+Postgres SQL Stable Postgres 6.2 and earlier is stable,
+ but problems were reported with 6.3
+Debugger Beta
+Unified ODBC Beta
+Solid Deprecated Replaced by Unified ODBC
+iODBC Deprecated Replaced by Unified ODBC
+Adabas Deprecated Replaced by Unified ODBC
+LDAP Stable Lightweight Directory Access Protocol.
+dBase
+FilePro
+Oracle Beta Not tested thoroughly enough.
+IMAP Beta Bundled in the dl/ directory
+SNMP Stable Very solid, but also very limited.
+ Only supports GET and WALK requests.
+Raima Velocis Beta If use with Unified ODBC, replaced
+ by Unified ODBC
+Raima Velocis Alpha If use without Unified ODBC
diff --git a/FUNCTION_LIST.txt b/FUNCTION_LIST.txt
new file mode 100644
index 0000000..2d567f7
--- /dev/null
+++ b/FUNCTION_LIST.txt
@@ -0,0 +1,538 @@
+Functions:
+
+Functions marked with 'u' do not work, or may not work correctly under windows.
+
+basic_functions
+ include
+ _include
+ isset
+
+ intval
+ doubleval
+ strval
+ short_tags
+ sleep
+u usleep
+ ksort
+ asort
+ sort
+ count
+ chr
+ ord
+ flush
+ end
+ prev
+ next
+ reset
+ current
+ key
+ gettype
+ settype
+ min
+ max
+
+ addslashes
+ chop
+ pos
+
+ fsockopen
+ getimagesize
+ htmlspecialchars
+ md5
+
+ parse_url
+
+ parse_str
+ phpinfo
+ phpversion
+ strlen
+ strtok
+ strtoupper
+ strtolower
+ strchr
+ basename
+ dirname
+ stripslashes
+ strstr
+ strrchr
+ substr
+ quotemeta
+ urlencode
+ urldecode
+ ucfirst
+ strtr
+ sprintf
+ printf
+
+ exec
+ system
+ escapeshellcmd
+ passthru
+
+ soundex
+
+ rand
+ srand
+ getrandmax
+ gethostbyaddr
+ gethostbyname
+ explode
+ implode
+ error_reporting
+ clearstatcache
+
+ get_current_user
+ getmyuid
+ getmypid
+u getmyinode
+ getlastmod
+
+ base64_decode
+ base64_encode
+
+ abs
+ ceil
+ floor
+ sin
+ cos
+ tan
+ asin
+ acos
+ atan
+ pi
+ pow
+ exp
+ log
+ log10
+ sqrt
+ bindec
+ hexdec
+ octdec
+ decbin
+ decoct
+ dechex
+
+ getenv
+ putenv
+
+ time
+ mktime
+ date
+ gmdate
+ getdate
+ checkdate
+ microtime
+ uniqid
+
+u linkinfo
+u readlink
+u symlink
+u link
+u unlink
+
+
+bcmath_functions
+ bcadd
+ bcsub
+ bcmul
+ bcdiv
+ bcmod
+ bcpow
+ bcsqrt
+ bcscale
+ bccomp
+
+dir_functions
+ opendir
+ closedir
+ chdir
+ rewinddir
+ readdir
+ dir
+
+dl_functions
+ dl(string module_name); dynamicly load a module
+
+dns_functions
+ gethostbyaddr
+ gethostbyname
+
+file_functions
+ pclose
+ popen
+ readfile
+ rewind
+ rmdir
+ umask
+ fclose
+ feof
+ fgets
+ fgetss
+ fopen
+ fpassthru
+ fseek
+ ftell
+ fputs
+ mkdir
+ rename
+ copy
+ tempnam
+ file
+
+filestat_functions
+ fileatime
+ filectime
+u filegroup
+u fileinode
+ filemtime
+u fileowner
+ fileperms
+ filesize
+ filetype
+ stat
+u chown
+u chgrp
+u chmod
+ touch
+ file_exists
+ is_executable
+ is_dir
+ is_readable
+ is_writeable
+u is_link
+
+header_functions
+ setcookie
+ header
+
+mail_functions
+ mail
+
+reg_functions
+ ereg
+ ereg_replace
+ eregi
+ eregi_replace
+ split
+ sql_regcase
+
+syslog_functions (writes to event log on win NT)
+ openlog
+ syslog
+ closelog
+
+The following are optional modules and may or may not be compiled into php, or may be compiled as a loadable module.
+
+odbc_functions (obsolete, use uodbc below)
+ sqlconnect
+ sqldisconnect
+ sqlfetch
+ sqlexecdirect
+ sqlgetdata
+ sqlfree
+ sqlrowcount
+
+uodbc_functions
+ (int) odbc_autocommit($connection_id, $OnOff)
+ (void) odbc_close($connection_id)
+ (void) odbc_close_all(void)
+ (int) odbc_commit($connection_id)
+ (int) odbc_connect($dsn, $user, $password)
+ (int) odbc_pconnect($dsn, $user, $password)
+ (string) odbc_cursor($result_id)
+ (int) odbc_do($connection_id, $query_string)
+ (int) odbc_exec($connection_id, $query_string)
+ (int) odbc_prepare($connection_id, $query_string)
+ (int) odbc_execute($result_id, $array)
+ (int) odbc_fetch_row($result_id, $row_number)
+ (int) odbc_fetch_into($result_id, $row_number, $array_ptr)
+ (int) odbc_field_len($result_id, $field_number)
+ (string) odbc_field_name($result_id, $field_number)
+ (string) odbc_field_type($result_id, $field)
+ (int) odbc_free_result($result_id)
+ (int) odbc_num_fields($result_id)
+ (int) odbc_num_rows($result_id)
+ (string) odbc_result($result_id, $field)
+ (int) odbc_result_all($result_id, $format)
+ (int) odbc_rollback($connection_id)
+
+msql_functions
+ msql_connect
+ msql_pconnect
+ msql_close
+ msql_select_db
+ msql_create_db
+ msql_drop_db
+ msql_query
+ msql
+ msql_list_dbs
+ msql_list_tables
+ msql_list_fields
+ msql_result
+ msql_num_rows
+ msql_num_fields
+ msql_fetch_row
+ msql_fetch_array
+ msql_fetch_object
+ msql_data_seek
+ msql_fetch_field
+ msql_field_seek
+ msql_free_result
+ msql_fieldname
+ msql_fieldtable
+ msql_fieldlen
+ msql_fieldtype
+ msql_fieldflags
+ msql_regcase
+ /* for downwards compatability */
+ msql_selectdb
+ msql_createdb
+ msql_dropdb
+ msql_freeresult
+ msql_numfields
+ msql_numrows
+ msql_listdbs
+ msql_listtables
+ msql_listfields
+ msql_dbname
+ msql_tablename
+
+ldap_functions
+ ldap_connect
+ ldap_bind
+ ldap_unbind
+ ldap_read
+ ldap_list
+ ldap_search
+ ldap_free_result
+ ldap_count_entries
+ ldap_first_entry
+ ldap_next_entry
+ ldap_get_entries
+ ldap_free_entry
+ ldap_first_attribute
+ ldap_next_attribute
+ ldap_get_attributes
+ ldap_get_values
+ ldap_get_dn
+ ldap_dn2ufn
+ ldap_add
+ ldap_delete
+ ldap_modify
+
+gd_functions
+ imagearc
+ imagechar
+ imagecharup
+ imagecolorallocate
+ imagecolorclosest
+ imagecolorexact
+ imagecolortransparent
+ imagecopyresized
+ imagecreate
+ imagecreatefromgif
+ imagedestroy
+ imagefill
+ imagefilledpolygon
+ imagefilledrectangle
+ imagefilltoborder
+ imagegif
+ imageinterlace
+ imageline
+ imagepolygon
+ imagerectangle
+ imagesetpixel
+ imagestring
+ imagestringup
+ imagesx
+ imagesy
+
+filepro_functions
+ filepro
+ filepro_rowcount
+ filepro_fieldname
+ filepro_fieldtype
+ filepro_fieldwidth
+ filepro_fieldcount
+ filepro_retrieve
+
+dbm_functions
+ dblist
+ dbmopen
+ dbmclose
+ dbminsert
+ dbmfetch
+ dbmreplace
+ dbmexists
+ dbmdelete
+ dbmfirstkey
+ dbmnextkey
+
+dbase_functions
+ dbase_open
+ dbase_create
+ dbase_close
+ dbase_numrecords
+ dbase_numfields
+ dbase_add_record
+ dbase_get_record
+ dbase_delete_record
+ dbase_pack
+
+calendar_functions
+ jdtogregorian
+ gregoriantojd
+ jdtojulian
+ juliantojd
+ jdtojewish
+ jewishtojd
+ jdtofrench
+ frenchtojd
+ jddayofweek
+ jdmonthname
+
+adabas_functions
+(int) ada_afetch($result_id, $rownumber, $result array)
+(int) ada_autocommit($connection_id, $OnOff)
+(void) ada_close($connection_id)
+ ada_closeall
+(int) ada_commit($connection_id)
+(int) ada_connect($dsn, $user, $password)
+(int) ada_exec($connection_id, $query_string)
+(int) ada_fetchrow($result_id, $row?number)
+ ada_fieldlen
+(string) ada_fieldname($result_id, $field_number)
+(string) ada_fieldtype($result_id, $field)
+(int) ada_freeresult($result_id)
+(int) ada_numfields($result_id)
+(int) ada_numrows($result_id)
+(string) ada_result($result_id, $field)
+(int) ada_resultall($result_id, $format)
+(int) ada_rollback($connection_id)
+***(int) ada_fieldnum($result_id, $field_name) (this function is not in adabase.c
+
+crypt_functions
+ crypt
+
+mysql_functions
+ mysql_connect
+ mysql_pconnect
+ mysql_close
+ mysql_select_db
+ mysql_create_db
+ mysql_drop_db
+ mysql_query
+ mysql
+ mysql_list_dbs
+ mysql_list_tables
+ mysql_list_fields
+ mysql_affected_rows
+ mysql_insert_id
+ mysql_result
+ mysql_num_rows
+ mysql_num_fields
+ mysql_fetch_row
+ mysql_fetch_array
+ mysql_fetch_object
+ mysql_data_seek
+ mysql_fetch_lengths
+ mysql_fetch_field
+ mysql_field_seek
+ mysql_free_result
+ mysql_fieldname
+ mysql_fieldtable
+ mysql_fieldlen
+ mysql_fieldtype
+ mysql_fieldflags
+ /* for downwards compatability */
+ mysql_selectdb
+ mysql_createdb
+ mysql_dropdb
+ mysql_freeresult
+ mysql_numfields
+ mysql_numrows
+ mysql_listdbs
+ mysql_listtables
+ mysql_listfields
+ mysql_dbname
+ mysql_tablename
+
+oracle_functions
+ ora_close
+ ora_commit
+ ora_commitoff
+ ora_commiton
+ ora_error
+ ora_errorcode
+ ora_exec
+ ora_fetch
+ ora_getcolumn
+ ora_logoff
+ ora_logon
+ ora_open
+ ora_parse
+ ora_rollback
+
+pgsql_functions
+ pg_connect
+ pg_pconnect
+ pg_close
+ pg_dbname
+ pg_errormessage
+ pg_options
+ pg_port
+ pg_tty
+ pg_host
+ pg_exec
+ pg_numrows
+ pg_numfields
+ pg_fieldname
+ pg_fieldsize
+ pg_fieldtype
+ pg_fieldnum
+ pg_result
+ pg_fieldprtlen
+ pg_getlastoid
+ pg_freeresult
+ pg_locreate
+ pg_lounlink
+ pg_loopen
+ pg_loclose
+ pg_loread
+ pg_lowrite
+ pg_loreadall
+
+sybase_functions
+ sybase_connect
+ sybase_pconnect
+ sybase_close
+ sybase_select_db
+ sybase_query
+ sybase_free_result
+ sybase_get_last_message
+ sybase_num_rows
+ sybase_num_fields
+ sybase_fetch_row
+ sybase_fetch_array
+ sybase_fetch_object
+ sybase_data_seek
+ sybase_fetch_field
+ sybase_field_seek
+ sybase_result
+
+sybase_old_functions
+ sybsql_seek
+ sybsql_exit
+ sybsql_dbuse
+ sybsql_query
+ sybsql_isrow
+ sybsql_result
+ sybsql_connect
+ sybsql_nextrow
+ sybsql_numrows
+ sybsql_getfield
+ sybsql_numfields
+ sybsql_fieldname
+ sybsql_result_all
+ sybsql_checkconnect
+
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..6ab6615
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,159 @@
+Installation Instructions for PHP3
+----------------------------------
+
+For the impatient here is a quick set of steps that will build PHP3
+as an Apache module for Apache 1.3.0 with MySQL support. A more verbose
+explanation follows.
+
+
+QUICK INSTALL
+
+gunzip apache_1.3.x.tar.gz
+tar xvf apache_1.3.x.tar
+gunzip php-3.0.x.tar.gz
+tar xvf php-3.0.x.tar
+cd apache_1.3.x
+./configure --prefix=/www
+cd ../php-3.0.x
+./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars
+make
+make install
+cd ../apache_1.3.x
+./configure --prefix=/www --activate-module=src/modules/php3/libphp3.a
+ (The above line is correct! Yes, we know libphp3.a does not exist at this
+ stage. It isn't supposed to. It will be created.)
+make
+ (you should now have an httpd binary which you can copy to your Apache bin dir)
+cd ../php-3.0.x
+cp php3.ini-dist /usr/local/lib/php3.ini
+You can edit /usr/local/lib/php3.ini file to set PHP options.
+Edit your httpd.conf or srm.conf file and add:
+ AddType application/x-httpd-php3 .php3
+
+
+VERBOSE INSTALL
+
+Installing PHP3 can be done in four simple steps:
+
+1. Unpack your distribution file.
+
+ You will have downloaded a file named something like php3xn.tar.gz.
+ Unzip this file with a command like: gunzip php3xn.tar.gz
+
+ Next you have to untar it with: tar -xvf php3xn.tar
+
+ This will create a php-3.0.x directory. cd into this new directory.
+
+2. Configure PHP3.
+
+ You now have to choose the options you would like. There are quite
+ a few of them. To see a list, type: ./configure --help
+
+ You can also use the supplied 'setup' script, which will ask you
+ a series of questions and automatically run the configure script
+ for you.
+
+ The only options that you are likely to want to use are the ones in
+ the last section entitled, "--enable and --with options recognized:"
+
+ A popular choice is to build the Apache module version. You need
+ to know where the source code directory for your Apache server is
+ located. Then use an option like: --with-apache=/usr/local/src/apache
+ if that is your Apache source code directory. If you only specify
+ --with-apache, then it will default to look for your Apache source
+ in /usr/local/etc/httpd.
+
+ NOTE: The directory you specify should be the top-level of the
+ unpacked Apache (or Stronghold) distribution. The configure program
+ will automatically look for httpd.h in different directories under that
+ location depending on which version of Apache, including Stronghold,
+ you are running.
+
+ For MySQL support, since newer versions of MySQL installs its various
+ components under /usr/local, this is the default. If you have
+ changed the location you can specify it with: --with-mysql=/opt/local
+ for example. Otherwise just use: --with-mysql
+
+ *NOTE* If you are using Apache 1.3b6 or later, you should run the
+ Apache Configure script at least once before compiling PHP. It
+ doesn't matter how you have Apache configured at this point.
+
+3. Compile and install the files. Simply type: make install
+
+ For the Apache module version this will copy the appropriate files
+ to the src/modules/php3 directory in your Apache distribution if
+ you are using Apache 1.3.x. If you are still running Apache 1.2.x
+ these files will be copied directly to the main src directory.
+
+ For Apache 1.3b6 and later, you can use the new APACI configuration
+ mechanism. To automatically build Apache with PHP support, use:
+
+ cd apache_1.3.x
+ ./configure --prefix=/<path>/apache \
+ --activate-module=src/modules/php3/libphp3.a
+ make
+ make install
+
+ If you do not wish to use this new configuration tool, the old
+ install procedure (src/Configure) will work fine.
+
+ If you are using the old Apache ./Configure script, you will have to
+ edit the Apache src/Configuration file manually. If you do not have
+ this file, copy Configuration.tmpl to Configuration.
+
+ For Apache 1.3.x add:
+
+ AddModule modules/php3/libphp3.a
+
+ For Apache 1.3.x don't do anything else. Just add this line and then
+ run "./Configure" followed by "make".
+
+ For Apache 1.2.x add:
+
+ Module php3_module mod_php3.o
+
+ For Apache 1.2.x you will also have to look in the libphp3.module file,
+ which was copied to the src directory. The EXTRA_LIBS line in the Apache
+ Configuration file needs to be set to use the same libs as specified on
+ the LIBS line in libphp3.module. You also need to make sure to add
+ "-L." to the beginning of the EXTRA_LIBS line.
+
+ So, as an example, your EXTRA_LIBS line might look like:
+
+ EXTRA_LIBS=-L. -lphp3 -lgdbm -ldb -L/usr/local/mysql/lib -lmysqlclient
+
+ NOTE: You should not enclose the EXTRA_LIBS line in double-quotes, as it
+ is in the libphp3.module file.
+
+ Also, look at the RULE_WANTHSREGEX setting in the libphp3.module file
+ and set the WANTHSREGEX directive accordingly in your Configuration file.
+ This last step applies to versions of Apache prior to 1.3b3.
+
+ This is a bit of a hassle, but should serve as incentive to move to
+ Apache 1.3.x where this step has been eliminated.
+
+ Once you are satisfied with your Configuration settings, type: ./Configure
+ If you get errors, chances are that you forgot a library or made a typo
+ somewhere. Re-edit Configuration and try again. If it goes well,
+ type: make
+
+4. Setting up the server.
+
+ You should now have a new httpd binary. Shut down your existing server,
+ if you have one, and copy this new binary overtop of it. Perhaps make
+ a backup of your previous one first. Then edit your conf/srm.conf file
+ and add the line:
+
+ AddType application/x-httpd-php3 .php3
+
+ There is also an interesting feature which can be quite instructive and
+ helpful while debugging. That is the option of having colour syntax
+ highlighting. To enable this, add the following line:
+
+ AddType application/x-httpd-php3-source .phps
+
+ Any file ending in .phps will now be displayed with full colour syntax
+ highlighting instead of being executed.
+
+ When you are finished making changes to your srm.conf file, you can
+ start up your server.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a59e164
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,64 @@
+ --------------------------------------------------------------------
+ Copyright (c) 1998 The PHP Development Team. All rights reserved.
+ --------------------------------------------------------------------
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Commercial redistribution of larger works derived from, or
+ works which bundle PHP, requires written permission from the
+ PHP Development Team. You may charge a fee for the physical
+ act of transferring a copy, and must make it clear that the
+ fee being charged is for the distribution, and not for the
+ software itself. You may, at your option, offer warranty
+ protection in exchange for a fee.
+
+ 2. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 3. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ 4. All advertising materials mentioning features or use of this
+ software must display the following acknowledgment:
+ "This product includes software written by the PHP Development
+ Team"
+
+ 5. The name "PHP" must not be used to endorse or promote products
+ derived from this software without prior written permission
+ from the PHP Development Team. This does not apply to add-on
+ libraries or tools that work in conjunction with PHP. In such
+ a case the PHP name may be used to indicate that the product
+ supports PHP.
+
+ 6. Redistributions of any form whatsoever must retain the following
+ acknowledgment:
+ "This product includes software written by the PHP Development
+ Team".
+
+ THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND
+ ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP
+ DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ --------------------------------------------------------------------
+
+ This software consists of voluntary contributions made by many
+ individuals on behalf of the PHP Development Team.
+
+ The PHP Development Team can be contacted via Email at core@php.net.
+
+ For more information on the PHP Development Team and the PHP
+ project, please see <http://www.php.net>.
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..1636d80
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,1078 @@
+# +----------------------------------------------------------------------+
+# | PHP HTML Embedded Scripting Language Version 3.0 |
+# +----------------------------------------------------------------------+
+# | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+# +----------------------------------------------------------------------+
+# | This program is free software; you can redistribute it and/or modify |
+# | it under the terms of one of the following licenses: |
+# | |
+# | A) the GNU General Public License as published by the Free Software |
+# | Foundation; either version 2 of the License, or (at your option) |
+# | any later version. |
+# | |
+# | B) the PHP License as published by the PHP Development Team and |
+# | included in the distribution in the file: LICENSE |
+# | |
+# | This program is distributed in the hope that it will be useful, |
+# | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+# | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+# | GNU General Public License for more details. |
+# | |
+# | You should have received a copy of both licenses referred to here. |
+# | If you did not, or have any questions about PHP licensing, please |
+# | contact core@php.net. |
+# +----------------------------------------------------------------------+
+
+#
+# $Id$
+#
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+srcdir = @srcdir@
+VPATH = @srcdir@
+bindir = @bindir@
+ZEND_DIR = $(srcdir)/libzend
+
+CC = @CC@
+AR = ar rc
+BINNAME = @BINNAME@
+INSTALL_IT = @INSTALL_IT@
+INCLUDE = -I$(srcdir) -I. -I$(ZEND_DIR) @GDBM_INCLUDE@ @ORACLE_INCLUDE@ @APACHE_INCLUDE@ @FHTTPD_INCLUDE@ @ADA_INCLUDE@ @IODBC_INCLUDE@ @SYBASE_INCLUDE@ @SYBASE_CT_INCLUDE@ @MYSQL_INCLUDE@ @MSQL_INCLUDE@ @SOLID_INCLUDE@ @EMPRESS_INCLUDE@ @OPENLINK_INCLUDE@ @PGSQL_INCLUDE@ @LDAP_INCLUDE@ @VELOCIS_INCLUDE@ @CODBC_INCLUDE@ @GD_INCLUDE@ @IMAP_INCLUDE@ @ZLIB_INCLUDE@ @PDFLIB_INCLUDE@ @FDFLIB_INCLUDE@ @IFX_INCLUDE@ @SNMP_INCLUDE@ @IBASE_INCLUDE@
+PROF_CFLAGS =
+CFLAGS_SHLIB = @CFLAGS_SHLIB@
+LDFLAGS_SHLIB = @LDFLAGS_SHLIB@
+LDFLAGS_SHLIB_EXPORT = @LDFLAGS_SHLIB_EXPORT@
+CPPFLAGS = @CPPFLAGS@
+CFLAGS = @CFLAGS@ $(CFLAGS_SHLIB) $(CPPFLAGS) $(INCLUDE) @DEBUG_CFLAGS@ @STRONGHOLD@ $(PROF_CFLAGS)
+LDFLAGS = @LDFLAGS@ $(LDFLAGS_SHLIB) $(LDFLAGS_SHLIB_EXPORT) -L$(ZEND_DIR)
+REGCFLAGS = $(CFLAGS)
+RANLIB = @RANLIB@
+YACC = @YACC@
+MAINT = @MAINT@
+APXS = @APXS@
+APXS_LDFLAGS = @APXS_LDFLAGS@
+WARNING_LEVEL = @WARNING_LEVEL@
+
+SOURCE = main.c internal_functions.c snprintf.c php3_sprintf.c \
+ configuration-parser.c configuration-scanner.c request_info.c \
+ safe_mode.c fopen-wrappers.c php3_realpath.c alloca.c output.c \
+ php_ini.c
+OBJS = main.o internal_functions.o snprintf.o php3_sprintf.o \
+ configuration-parser.o configuration-scanner.o request_info.o \
+ safe_mode.o fopen-wrappers.o php3_realpath.o alloca.o output.o \
+ php_ini.o
+
+FUNCTIONS_SOURCE = functions/adabasd.c functions/apache.c functions/fhttpd.c \
+ functions/basic_functions.c \
+ functions/crypt.c functions/datetime.c functions/db.c \
+ functions/dbase.c functions/dir.c \
+ functions/dl.c functions/dns.c functions/exec.c functions/file.c \
+ functions/filepro.c functions/filestat.c \
+ functions/formatted_print.c functions/fsock.c functions/gd.c \
+ functions/head.c functions/html.c functions/image.c functions/imap.c\
+ functions/link.c functions/mail.c functions/math.c functions/iptc.c \
+ functions/md5.c functions/microtime.c functions/mime.c \
+ functions/msql.c functions/mysql.c \
+ functions/oracle.c functions/oci8.c functions/pack.c \
+ functions/pageinfo.c functions/pgsql.c \
+ functions/post.c functions/rand.c functions/reg.c \
+ functions/solid.c functions/soundex.c \
+ functions/string.c functions/syslog.c functions/type.c \
+ functions/uniqid.c functions/sybase.c \
+ functions/sybase-ct.c functions/url.c functions/base64.c \
+ functions/info.c @BCMATH_SRC@ functions/xml.c \
+ functions/unified_odbc.c functions/ldap.c functions/browscap.c \
+ functions/velocis.c functions/gdttf.c functions/gdcache.c \
+ functions/zlib.c functions/COM.c functions/ifx.c \
+ functions/pdf.c functions/hw.c functions/hg_comm.c functions/dlist.c \
+ functions/fdf.c \
+ functions/snmp.c functions/var.c functions/interbase.c \
+ functions/quot_print.c functions/cyr_convert.c \
+ functions/sysvsem.c functions/sysvshm.c functions/dav.c
+
+FUNCTIONS = $(FUNCTIONS_SOURCE:.c=.o)
+
+LIBS = $(PHPLIBS) @SYBASE_CT_LFLAGS@ @SYBASE_CT_LIBS@ @FHTTPD_LIB@ @DBASE_LIB@ @REGEX_LIB@ @DBM_LIB@ @ORACLE_LFLAGS@ @ORACLE_LIBS@ @IODBC_LFLAGS@ @IODBC_LIBS@ @SYBASE_LFLAGS@ @SYBASE_LIBS@ @SYBASE_CT_LFLAGS@ @SYBASE_CT_LIBS@ @MYSQL_LFLAGS@ @MYSQL_LIBS@ @MSQL_LFLAGS@ @MSQL_LIBS@ @ADA_LFLAGS@ @ADA_LIBS@ @SOLID_LIBS@ @EMPRESS_LIBS@ @OPENLINK_LFLAGS@ @OPENLINK_LIBS@ @PGSQL_LFLAGS@ @PGSQL_LIBS@ @LDAP_LFLAGS@ @LDAP_LIBS@ @VELOCIS_LIBS@ @CODBC_LFLAGS@ @CODBC_LIBS@ @IMAP_LIBS@ @GD_LIBS@ @ZLIB_LIBS@ @PDFLIB_LIBS@ @FDFLIB_LIBS@ @IFX_LFLAGS@ @IFX_LIBS@ @SNMP_LFLAGS@ @SNMP_LIBS@ @IBASE_LFLAGS@ @IBASE_LIBS@ @XML_LIBS@ @LIBS@
+
+all: $(BINNAME)
+
+php: $(OBJS) $(FUNCTIONS) @REGEX_LIB@ @FHTTPD_LIB@ @DBASE_LIB@$ $(ZEND_DIR)/libzend.a
+ $(CC) $(CFLAGS) -o $(BINNAME) $(LDFLAGS) $(OBJS) $(FUNCTIONS) $(LIBS)
+
+libphp3.a: $(OBJS) $(FUNCTIONS) @DBASE_LIB@
+ $(AR) $(BINNAME) $(OBJS) $(FUNCTIONS) @DBASE_LIB@
+ $(RANLIB) $(BINNAME)
+
+libmodphp3.a: $(OBJS) $(FUNCTIONS) @DBASE_LIB@
+ $(AR) $(BINNAME) $(OBJS) $(FUNCTIONS) @DBASE_LIB@
+ $(RANLIB) $(BINNAME)
+
+libmodphp3-so.a: $(OBJS) $(FUNCTIONS) @DBASE_LIB@
+ $(AR) libmodphp3-so.a $(OBJS) $(FUNCTIONS) @DBASE_LIB@
+ $(RANLIB) libmodphp3-so.a
+
+libphp3.so: mod_php3.c libmodphp3-so.a
+ $(APXS) -c -o libphp3.so $(APXS_LDFLAGS) mod_php3.c libmodphp3-so.a
+
+docs:
+ cd doc; $(MAKE)
+
+regex/libregex.a:
+ (cd regex; $(MAKE) lib)
+
+dbase/libdbf.a:
+ (cd dbase; $(MAKE))
+
+functions/ifx.c: functions/ifx.ec
+ (if test @INFORMIXDIR@; then esql -e @IFX_ESQL_FLAGS@ functions/ifx.ec; mv ifx.c functions; else touch functions/ifx.c; fi)
+
+configuration-parser.h configuration-parser.c: $(srcdir)/configuration-parser.y
+ bison -p cfg -v -d $(srcdir)/configuration-parser.y -o configuration-parser.c
+
+configuration-scanner.o:
+ $(CC) $(CFLAGS) -w$(WARNING_LEVEL) -c configuration-scanner.c
+
+configuration-scanner.c: $(srcdir)/configuration-scanner.l
+ flex -Pcfg -oconfiguration-scanner.c -i $(srcdir)/configuration-scanner.l
+
+clean:
+ -rm -f libphp3.a libmodphp3.a php *.o
+ -rm -f $(FUNCTIONS) functions/ifx.c
+ -rm -f test/php.desc test/php.in test/php.out test/php.test
+ -rm -f test/a.tmp test/b.tmp test/test.dbm*
+ (cd dbase; $(MAKE) clean)
+
+distclean: clean
+ -rm -f *-parser.[ch] *-scanner.c *.output
+ -rm -f config.status config.cache config.log
+ -rm -f Makefile Makefile.depend config.h build-defs.h
+ -rm -f libphp3.module stamp-h
+ -rm -f regex/*.o regex/*.a regex/*.ih
+ -rm -f dbase/*.o dbase/*.a
+ -rm -f doc/checkdoc doc/funcparse doc/version.ent
+ -rm -f do-conf test/test.log extra/gd/bdf2gdfont
+ -rm -f doc/Makefile regex/Makefile dbase/Makefile
+
+bench: $(BINNAME)
+ ./$(BINNAME) -c. tests/bench.phtml
+
+# can't use a single rule for this because 'test' is a directory
+test: regression
+regression check: $(BINNAME)
+ cd test && ./testall
+
+config.status: configure
+ ./config.status --recheck
+
+build-defs.h config.h: stamp-h
+stamp-h: config.h.in config.status
+ CONFIG_FILES='build-defs.h stamp-h' ./config.status
+
+Makefile: Makefile.in config.status
+ CONFIG_FILES=$@ CONFIG_HEADERS= ./config.status
+
+#
+# You must use '--enable-maintainer-mode' with configure to enable
+# these rules, which requires autoconf be installed.
+#
+configure: @MAINT@ configure.in aclocal.m4
+ cd $(srcdir) && autoconf
+
+config.h.in: @MAINT@ stamp-h.in
+stamp-h.in: configure.in aclocal.m4 acconfig.h
+ cd ${srcdir} && autoheader && touch ${srcdir}/stamp-h.in
+
+install: $(BINNAME)
+ $(INSTALL_IT)
+
+indent: clean
+ indent -v -kr -cli4 -ts4 \
+ -T pval -T HashTable -T Bucket -T Token -T TokenCache -T TokenCacheManager \
+ -T switch_expr -T internal_function -T control_structure_data \
+ -T MemoryHashTable -T MemoryBucket \
+ -T pvalue_value -T Stack *.c *.h functions/*.c functions/*.h
+ rm -f *~ functions/*~
+
+.c.o:
+ $(CC) $(CFLAGS) -c $< -o $@
+ @bn=`echo $@ | sed -e 's#functions/##'`; test -f $@ || \
+ (test "$@" != "$$bn" && test -f "$$bn" && mv $$bn $@)
+
+functions/number.o: functions/number.c
+ $(CC) $(CFLAGS) -w$(WARNING_LEVEL) -c $< -o $@
+ @bn=`echo $@ | sed -e 's#functions/##'`; test -f $@ || \
+ (test "$@" != "$$bn" && test -f "$$bn" && mv $$bn $@)
+
+parser-scanner: configuration-parser.c configuration-scanner.c
+
+depend: parser-scanner
+ $(CC) $(CFLAGS) -MM $(SOURCE) | perl -pe 's|regex/regex.h||;' > Makefile.depend
+ $(CC) $(CFLAGS) -MM $(FUNCTIONS_SOURCE) | perl -pe 's|^(.+\.o)|functions/$$1|; s|regex/regex.h||;' >> Makefile.depend
+
+main.o: main.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h build-defs.h php_ini.h main.h \
+ libzend/zend_globals.h libzend/zend_ptr_stack.h \
+ libzend/zend_compile.h libzend/zend-parser.h \
+ libzend/zend_execute.h control_structures.h \
+ functions/basic_functions.h functions/info.h functions/head.h \
+ functions/post.h functions/type.h snprintf.h logos.h
+internal_functions.o: internal_functions.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h internal_functions_registry.h \
+ libzend/zend_compile.h libzend/zend-parser.h \
+ libzend/zend_globals.h libzend/zend_ptr_stack.h \
+ libzend/zend_execute.h functions/php3_ifx.h \
+ functions/php3_ldap.h functions/php3_mysql.h functions/php3_bcmath.h \
+ functions/php3_msql.h functions/basic_functions.h functions/phpmath.h \
+ functions/php3_string.h functions/php3_oci8.h functions/oracle.h \
+ functions/base64.h functions/php3_dir.h functions/dns.h \
+ functions/php3_pgsql.h functions/php3_velocis.h \
+ functions/php3_sybase.h functions/php3_sybase-ct.h functions/reg.h \
+ functions/php3_mail.h functions/imap.h functions/md5.h \
+ functions/global.h functions/php3_gd.h functions/html.h \
+ functions/dl.h functions/head.h functions/post.h functions/exec.h \
+ functions/php3_solid.h functions/adabasd.h functions/file.h \
+ functions/dbase.h functions/hw.h functions/filepro.h functions/db.h \
+ functions/php3_syslog.h functions/php3_filestat.h \
+ functions/php3_browscap.h functions/pack.h \
+ functions/php3_unified_odbc.h dl/snmp/php3_snmp.h \
+ functions/php3_zlib.h functions/php3_COM.h functions/php3_interbase.h \
+ functions/php3_xml.h functions/php3_pdf.h functions/php3_fdf.h \
+ functions/php3_sysvsem.h functions/php3_sysvshm.h \
+ functions/php3_dav.h
+snprintf.o: snprintf.c config.h
+php3_sprintf.o: php3_sprintf.c config.h
+configuration-parser.o: configuration-parser.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/dl.h functions/file.h \
+ functions/php3_browscap.h libzend/zend_extensions.h \
+ libzend/zend_compile.h libzend/zend-parser.h \
+ libzend/zend_globals.h libzend/zend_ptr_stack.h \
+ libzend/zend_execute.h
+configuration-scanner.o: configuration-scanner.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h configuration-parser.h
+request_info.o: request_info.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h
+safe_mode.o: safe_mode.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/pageinfo.h
+fopen-wrappers.o: fopen-wrappers.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h php3_realpath.h functions/head.h \
+ functions/url.h functions/base64.h functions/fsock.h \
+ functions/php3_string.h libzend/zend_compile.h \
+ libzend/zend-parser.h libzend/zend_globals.h \
+ libzend/zend_ptr_stack.h libzend/zend_execute.h
+php3_realpath.o: php3_realpath.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h
+alloca.o: alloca.c
+output.o: output.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/head.h
+php_ini.o: php_ini.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h php_ini.h
+functions/adabasd.o: functions/adabasd.c config.h build-defs.h php.h \
+ php_version.h libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_string.h \
+ functions/head.h functions/adabasd.h
+functions/apache.o: functions/apache.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/head.h
+functions/fhttpd.o: functions/fhttpd.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h
+functions/basic_functions.o: functions/basic_functions.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h php_ini.h \
+ internal_functions_registry.h functions/basic_functions.h \
+ functions/phpmath.h functions/php3_string.h functions/dns.h \
+ functions/md5.h functions/global.h functions/html.h functions/post.h \
+ functions/exec.h functions/info.h functions/url.h \
+ functions/datetime.h functions/fsock.h functions/image.h \
+ functions/php3_link.h functions/php3_filestat.h functions/microtime.h \
+ functions/pageinfo.h functions/uniqid.h functions/base64.h \
+ functions/php3_mail.h functions/php3_var.h functions/php3_iptc.h \
+ functions/quot_print.h functions/cyr_convert.h \
+ libzend/zend_globals.h libzend/zend_ptr_stack.h \
+ libzend/zend_compile.h libzend/zend-parser.h \
+ libzend/zend_execute.h
+functions/crypt.o: functions/crypt.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_string.h
+functions/datetime.o: functions/datetime.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/datetime.h snprintf.h
+functions/db.o: functions/db.c
+functions/dbase.o: functions/dbase.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h
+functions/dir.o: functions/dir.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_dir.h
+functions/dl.o: functions/dl.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/dl.h
+functions/dns.o: functions/dns.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/dns.h
+functions/exec.o: functions/exec.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_string.h \
+ functions/head.h functions/exec.h
+functions/file.o: functions/file.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/head.h \
+ functions/php3_string.h functions/file.h snprintf.h functions/fsock.h
+functions/filepro.o: functions/filepro.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/filepro.h
+functions/filestat.o: functions/filestat.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_filestat.h
+functions/formatted_print.o: functions/formatted_print.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/head.h \
+ functions/php3_string.h
+functions/fsock.o: functions/fsock.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/fsock.h \
+ functions/base64.h functions/file.h functions/post.h functions/url.h \
+ build-defs.h
+functions/gd.o: functions/gd.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/head.h \
+ functions/php3_gd.h functions/gdttf.h
+functions/head.o: functions/head.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/reg.h \
+ functions/php3_string.h functions/pageinfo.h main.h \
+ libzend/zend_globals.h libzend/zend_ptr_stack.h \
+ libzend/zend_compile.h libzend/zend-parser.h \
+ libzend/zend_execute.h functions/datetime.h functions/head.h \
+ functions/post.h functions/url.h
+functions/html.o: functions/html.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/reg.h functions/html.h
+functions/image.o: functions/image.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/image.h
+functions/imap.o: functions/imap.c config.h php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h
+functions/link.o: functions/link.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_filestat.h \
+ functions/php3_link.h
+functions/mail.o: functions/mail.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h build-defs.h functions/php3_mail.h
+functions/math.o: functions/math.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/phpmath.h snprintf.h
+functions/iptc.o: functions/iptc.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_iptc.h
+functions/md5.o: functions/md5.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/md5.h functions/global.h
+functions/microtime.o: functions/microtime.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/microtime.h snprintf.h
+functions/mime.o: functions/mime.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/type.h functions/post.h \
+ functions/mime.h libzend/zend_globals.h \
+ libzend/zend_ptr_stack.h libzend/zend_compile.h \
+ libzend/zend-parser.h libzend/zend_execute.h
+functions/msql.o: functions/msql.c config.h php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_msql.h \
+ functions/reg.h functions/php3_string.h
+functions/mysql.o: functions/mysql.c config.h build-defs.h php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_string.h \
+ functions/php3_mysql.h
+functions/oracle.o: functions/oracle.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/oracle.h
+functions/oci8.o: functions/oci8.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_oci8.h
+functions/pack.o: functions/pack.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/head.h \
+ functions/php3_string.h functions/pack.h snprintf.h functions/fsock.h
+functions/pageinfo.o: functions/pageinfo.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/pageinfo.h
+functions/pgsql.o: functions/pgsql.c config.h php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_pgsql.h \
+ functions/php3_string.h
+functions/post.o: functions/post.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/mime.h functions/type.h \
+ functions/php3_string.h functions/post.h functions/url.h \
+ libzend/zend_globals.h libzend/zend_ptr_stack.h \
+ libzend/zend_compile.h libzend/zend-parser.h \
+ libzend/zend_execute.h
+functions/rand.o: functions/rand.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/phpmath.h
+functions/reg.o: functions/reg.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_string.h \
+ functions/reg.h
+functions/solid.o: functions/solid.c config.h build-defs.h php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_solid.h
+functions/soundex.o: functions/soundex.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_string.h
+functions/string.o: functions/string.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/reg.h functions/post.h \
+ functions/php3_string.h
+functions/syslog.o: functions/syslog.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h libzend/zend_globals.h \
+ libzend/zend_ptr_stack.h libzend/zend_compile.h \
+ libzend/zend-parser.h libzend/zend_execute.h \
+ functions/php3_syslog.h
+functions/type.o: functions/type.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/type.h
+functions/uniqid.o: functions/uniqid.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/uniqid.h
+functions/sybase.o: functions/sybase.c config.h php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_sybase.h \
+ functions/php3_string.h
+functions/sybase-ct.o: functions/sybase-ct.c config.h php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_sybase-ct.h \
+ functions/php3_string.h
+functions/url.o: functions/url.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/url.h
+functions/base64.o: functions/base64.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/base64.h
+functions/info.o: functions/info.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/head.h functions/info.h \
+ build-defs.h libzend/zend_globals.h \
+ libzend/zend_ptr_stack.h libzend/zend_compile.h \
+ libzend/zend-parser.h libzend/zend_execute.h
+functions/bcmath.o: functions/bcmath.c config.h build-defs.h php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/number.h \
+ functions/php3_bcmath.h
+functions/number.o: functions/number.c functions/number.h php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h
+functions/xml.o: functions/xml.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_xml.h
+functions/unified_odbc.o: functions/unified_odbc.c config.h build-defs.h php.h \
+ php_version.h libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h dl/phpdl.h functions/php3_string.h \
+ functions/php3_unified_odbc.h functions/head.h snprintf.h
+functions/ldap.o: functions/ldap.c config.h php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h
+functions/browscap.o: functions/browscap.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_browscap.h \
+ libzend/zend_globals.h libzend/zend_ptr_stack.h \
+ libzend/zend_compile.h libzend/zend-parser.h \
+ libzend/zend_execute.h
+functions/velocis.o: functions/velocis.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_velocis.h
+functions/gdttf.o: functions/gdttf.c config.h functions/gdttf.h \
+ functions/gdcache.h
+functions/gdcache.o: functions/gdcache.c config.h functions/gdcache.h
+functions/zlib.o: functions/zlib.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/head.h \
+ functions/php3_string.h functions/php3_zlib.h snprintf.h
+functions/COM.o: functions/COM.c
+functions/ifx.o: functions/ifx.c
+functions/pdf.o: functions/pdf.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/head.h \
+ functions/php3_pdf.h
+functions/hw.o: functions/hw.c config.h php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/head.h
+functions/hg_comm.o: functions/hg_comm.c config.h
+functions/dlist.o: functions/dlist.c config.h
+functions/fdf.o: functions/fdf.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/head.h \
+ functions/php3_fdf.h
+functions/snmp.o: functions/snmp.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_snmp.h
+functions/var.o: functions/var.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/reg.h functions/post.h \
+ functions/php3_string.h functions/php3_var.h
+functions/interbase.o: functions/interbase.c config.h php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_interbase.h
+functions/quot_print.o: functions/quot_print.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/quot_print.h
+functions/cyr_convert.o: functions/cyr_convert.c php.h php_version.h \
+ libzend/zend.h libzend/config.h \
+ libzend/config.unix.h libzend/zend_errors.h \
+ libzend/zend_alloc.h libzend/zend_hash.h \
+ libzend/zend_llist.h libzend/zend_API.h \
+ libzend/modules.h libzend/zend_list.h config.h \
+ request_info.h php3_compat.h libzend/zend_stack.h \
+ safe_mode.h fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/cyr_convert.h
+functions/sysvsem.o: functions/sysvsem.c config.h
+functions/sysvshm.o: functions/sysvshm.c config.h
+functions/dav.o: functions/dav.c php.h php_version.h libzend/zend.h \
+ libzend/config.h libzend/config.unix.h \
+ libzend/zend_errors.h libzend/zend_alloc.h \
+ libzend/zend_hash.h libzend/zend_llist.h \
+ libzend/zend_API.h libzend/modules.h \
+ libzend/zend_list.h config.h request_info.h php3_compat.h \
+ libzend/zend_stack.h safe_mode.h \
+ fopen-wrappers.h mod_php3.h output.h \
+ libzend/zend_operators.h libzend/zend_variables.h \
+ libzend/zend_constants.h functions/php3_dav.h
+
+# Local Variables:
+# tab-width: 4
+# End:
diff --git a/README.QNX b/README.QNX
new file mode 100644
index 0000000..d70d2e5
--- /dev/null
+++ b/README.QNX
@@ -0,0 +1,57 @@
+QNX4 Installation Notes
+-----------------------
+
+NOTE: General installation instructions are in the INSTALL file
+
+
+1. To compile and test PHP3 you have to grab, compile and install:
+ - GNU dbm library or another db library;
+ - GNU bison (1.25 or later; 1.25 tested);
+ - GNU flex (any version supporting -o and -P options; 2.5.4 tested);
+ - GNU diffutils (any version supporting -w option; 2.7 tested);
+
+2. To use CVS version you may need also:
+ - GNU CVS (1.9 tested);
+ - GNU autoconf (2.12 tested);
+ - GNU m4 (1.3 or later preferable; 1.4 tested);
+
+3. To run configure define -lunix in command line:
+ LDFLAGS=-lunix ./configure
+
+4. To use Sybase SQL Anywhere define ODBC_QNX and CUSTOM_ODBC_LIBS in
+ command line and run configure with --with-custom-odbc:
+ CFLAGS=-DODBC_QNX LDFLAGS=-lunix CUSTOM_ODBC_LIBS="-ldblib -lodbc" ./configure --with-custom-odbc=/usr/lib/sqlany50
+ If you have SQL Anywhere version 5.5.00, then you have to add
+ CFLAGS=-DSQLANY_BUG
+ to workaround its SQLFreeEnv() bug. Other versions has not been tested,
+ so try without this flag first.
+
+5. To build the Apache module, you may have to hardcode an include path for
+ alloc.h in your Apache base directory:
+ - APACHE_DIRECTORY/src/httpd.h:
+ change #include "alloc.h"
+ to #include "APACHE_DIRECTORY/src/alloc.h"
+ Unless you want to use system regex library, you have to hardcode also
+ a path to regex.h:
+ - APACHE_DIRECTORY/src/conf.h:
+ change #include <regex.h>
+ to #include "APACHE_DIRECTORY/src/regex/regex.h"
+ I don't know so far why this required for QNX, may be it is Watcom
+ compiler problem.
+
+ If you building Apache module with SQL Anywhere support, you'll get
+ symbol conflict with BOOL. It is defined in Apache (httpd.h) and in
+ SQL Anywhere (odbc.h). This has nothing to do with PHP, so you have to
+ fix it yourself someway.
+
+6. With above precautions, it should compile as is and pass regression
+ tests completely:
+ make
+ make check
+ make install
+
+ Don't bother me unless you really sure you made that all but it
+ still doesn't work.
+
+June 28, 1998
+Igor Kovalenko -- owl@infomarket.ru
diff --git a/README.WIN32 b/README.WIN32
new file mode 100644
index 0000000..4e667d1
--- /dev/null
+++ b/README.WIN32
@@ -0,0 +1,59 @@
+Windows 95/NT Specific Notes on Compilation
+
+Windows compilation has only been tested with Microsoft Visual C++
+Version 5 Standard Edition. The PHP executable has only had limited
+testing under Windows 95. SAFE MODE and any User or Group functionality
+has not been ported/tested.
+
+-----------------------------------------------------------------------
+Compiling PHP with MSVC5
+
+There are three msvc workspaces provided with this distribution. The one
+most people will use is php3.dsw. This contains project files for two
+versions on PHP, one with mySQL compiled internaly, and one without (both
+have ODBC internaly compiled). It also contains all the modules.
+
+The next workspace is php3extras.dsw. This project contains the converter
+and a program called phpwatch, which is a simple program to watch debugger
+output under windows. The 'socket' program is also available from the php
+site, which is a better alternative to phpwatch.
+
+The third workspace is php3sapi.dsw. These projects are experimental and
+will probably not compile most of the time. It contains preliminary work
+on the server api's for windows.
+
+-----------------------------------------------------------------------
+Base Configuration and Configuration Issues
+
+*The base configuration for the windows php version contains odbc
+ support. Support for other database modules will be provided as external dll files.
+*ODBC can be used to connect to many of the databases previously
+supported by php (though they can still be compiled in if you have
+the libraries!)
+
+-----------------------------------------------------------------------
+Makefiles
+
+Be sure to edit any windows makefile and change the include directories
+to be appropriate for your system.
+
+-----------------------------------------------------------------------
+CGI Version
+
+The makefile for the cgi version of php is located in the win32
+subdirectory of the php source tree. This make file is specificaly
+for Visual C++ V5.
+
+-----------------------------------------------------------------------
+ISAPI/NSAPI/WSAPI/Apache Versions
+
+These versions are not yet working. They are located in the php3sapi.dsw
+workspace.
+
+
+-----------------------------------------------------------------------
+Other Libraries
+
+See the php faq at php.net for information on where to obtain the various
+libraries needed to compile some modules.
+
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..5a35e41
--- /dev/null
+++ b/TODO
@@ -0,0 +1,100 @@
+$Id$
+
++----
+| * -- to be done
+| ? -- to be done sometime if possible
+| P -- in progress (name should appear in parentheses after task)
+| D -- delayed until later date (specify in parentheses after task)
+| U -- done, untested
+| V -- done
++----
+
+Configuration Issues
+--------------------
+* properly detect dbm routines when they're in libc
+* add the appropriate #define magic for memmove and friends (see
+ GNU autoconf info pages for details)
+* make it possible to disable support for some extensions (gd, dbm)
+* make it possible to build selected extensions so they are
+ dynamically-loadable
+
+Core Language Issues
+--------------------
+* go through PHP2's php.h and see how each special #define might be
+ applied/supported in PHP3
+* move Treatdata() to language-scanner.lex where hash_environment()
+ is called including a decision about priority of variables and moving
+ Treatdata() to use hash_add() instead of hash_update() for insertions
+ to the symbol table.
+* go through FIXME and XXX lines (egrep 'FIXME|XXX' *.[ch])
+* make lexer and parser thread-safe
+* verify that binary strings are handled correctly
+V don't evaluate truth expressions more than once
+V make unset() work on arrays (tricky)
+
+Core Functions
+--------------
+* go through all file functions and make sure they are opened in binary
+ mode in win32 if needed (ie copy)
+* go through all functions and look at PHP_SAFE_MODE issues
+* have a look at return codes of fsockopen() function - we should
+ probably RETURN_FALSE and then set an error code somewhere (Rasmus)
+* go through FIXME and XXX lines (egrep 'FIXME|XXX' functions/*.[ch])
+* add user-level flock() implementation to let people lock and unlock files
+* add "'" modifier to sprintf to group thousands by comma
+* Add an improved eval() that doesn't "leak"
+? sorting of objects with a user-defined comparison function (like Perl)
+ (this shouldn't be expected before 3.1, if at all).
+
+
+Extensions
+----------
+* add version strings for all extensions
+* Oracle persistent connections
+U gd support for windows
+* Illustra support (APIS)
+? CQL++ support (http://www.cql.com/)
+? GNU SQL support (does anybody actually use this?)
+? DB2 support (http://www.sleepycat.com/)
+? Shore support (http://www.cs.wisc.edu/shore/)
+? PGP Interface (use PGPlib?)
+? more Perl-like regex handling?
+
+Server Support
+--------------
+P ISAPI (Shane)
+ * process cookies
+ * blocking functions
+ * make sure it's Microsoft-clean so it can be used with other ISAPI
+ implementations
+* WSAPI
+* NSAPI
+ * process cookies
+ * check POST method handling code
+ * use Netscape memory allocation inside emalloc() and company
+* FastCGI support - see http://fastcgi.idle.com/
+
+Win32 Specific
+--------------
+* implement some kind of syslog->file log support for win95.
+* change all file open/read/write functions from c library to win32
+ api file functions. The win32 api functions handle both disk files
+ and network files. This will allow include and require to use http
+ or ftp files as the unix version does, and do away with my
+ workaround to support this. (3.1?)
+* implement symlinks via windows shell links (shortcuts). This will
+ work only at the script level and is not a c language level port.
+
+Testing
+-------
+* truss/strace a typical PHP request and see if there are some system
+ calls that could be optimized out
+* verify that regression tests exist for all core functions
+
+Miscellaneous
+-------------
+* remove hard-coded compilation options
+? locale issues - funny things happen in PHP2 when the locale is set to
+ use , instead of . as the decimal seperator. ie. 1.5+1.5 = 1
+? SSI->PHP3 conversion script
+? SQL-based access logging (start with examples/log-*.php3)
diff --git a/WISHLIST b/WISHLIST
new file mode 100644
index 0000000..99d3876
--- /dev/null
+++ b/WISHLIST
@@ -0,0 +1,17 @@
+- Persistant per-process scripting
+
+ Apache 1.3 has added things that makes this much easier than before.
+ The module structure now contains a child_init hook and a child_exit
+ hook where you can register functions to be called when an httpd
+ process starts up and when one shuts down (due to MaxRequestsPerChild
+ or a Kill). The only real trick now is to come up with some sort of
+ syntax for specifying what to do from the child_init call and the
+ child_exit call.
+
+ One idea is to be able to add a <PHP>...</PHP> block to the Apache
+ httpd.conf file which would somehow define a series of PHP statements
+ to be executed from the child_* calls. One for startup and another
+ block for shutdown. These blocks would work with the per-process
+ memory pool, so any variables initialized here would have a lifespan
+ equal to that of the httpd process. Basically request-spanning
+ global variables.
diff --git a/WISHLIST-3.1 b/WISHLIST-3.1
new file mode 100644
index 0000000..1320f71
--- /dev/null
+++ b/WISHLIST-3.1
@@ -0,0 +1,55 @@
+V Do yystype_ptr and hash pointers the right way - use the hash
+ pointer and the bucket pointer, instead of a pointer to the data.
+ Allows for a real unset() among other things.
+V Improve performance of simple variable lookups
+* Improve string performance by using smarter memory allocation methods
+- Improve preprocessor (handle require() efficiently), possibly handle
+ automatic preprocessing for sites based on timestamp
+V Use a reference count mechanism to prevent unnecessary duplication of data.
+* Write and stabilize a complete persistent data API. Feature wishlist:
+ - memory manager using shared memory
+ - process-global symbol table
+ - make api inter-thread capable for win32 and some far off future where unix
+ version will be multithreaded
+V Handle out of memory (inside emalloc()?)
+* Try to figure out a way to declare *real* global variables
+* Improve the reading of configuration variables into php3_ini (generalize)
+ Make it possible to implement config_get("configuration_variable") and
+ config_set("configuration_variable","value") that'll work with *php3_ini*,
+ not the configuration hash!
+* Bundle some nice classes (like Bjørn's graphing class)
+* Bundle some database abstraction classes
+* Distribute binaries
+* Clean up API and modules to make .so modules portable across CGI and server
+ binaries
+* dbm cleanup (don't arbitrarily pick, and support multiple concurrent formats)
+* start system defines so that we can move away from the standard c lib on
+ windows to the win32 lib. (file functions primarily)
+* COM implementation so php can be used as an asp language (cant find any docs
+ on how this is done though)
+* Clean up the file structure so the top-level directory isn't such a mess.
+* Bring the module concept to maturity: use libtool and make it
+ possible to decide at compile time whether you want to compile a
+ module statically or dynamically. Remove the distinction between
+ the stuff currently in dl/ and functions/.
+* a way of letting each module specify its options, so ini file options and
+ Apache directives can be set up from the same specification.
+V Make it possible to declare smarter user functions: (done in 3.0)
+ - Optional parameters
+ - Parameters that are forced/prefered by reference
+* Make object parsing more general, and allow nested arrays/objects with
+ unlimited levels.
+V Make it possible to copy references of variables.
+* data tainting (like perl -T)
+* multi-dimensional array support in GET/POST/COOKIE handling code
+* Persistent functions and classes
+* odbc_fetch_assoc
+* Add env handling to gpc_order
+* Populate track_vars regardless of gpc_order
+* a real exec() function
+* Support passing arguments to functions by name (e.g. foo(arg1 => "bar", arg2 => "foobar"))
+* Add an optional setting to destroy persistent resources if a PHP script terminates
+ abnormally
+V COM automation support for Win32
+? Add a setting for making function names case sensitive
+* stat() files before feeding them to flex - it doesn't handle special files very well
diff --git a/acconfig.h b/acconfig.h
new file mode 100644
index 0000000..663f5b9
--- /dev/null
+++ b/acconfig.h
@@ -0,0 +1,261 @@
+/* This is the default configuration file to read */
+#define CONFIGURATION_FILE_PATH "php3.ini"
+#define USE_CONFIG_FILE 1
+
+/* Some global constants defined by conigure */
+#undef PHP_BUILD_DATE
+#undef PHP_OS
+#undef PHP_UNAME
+
+/* define uint by configure if it is missed (QNX and BSD derived) */
+#undef uint
+
+/* define ulong by configure if it is missed (most probably is) */
+#undef ulong
+
+/* type check for in_addr_t */
+#undef in_addr_t
+
+/* crypt capability checks */
+#undef PHP3_STD_DES_CRYPT
+#undef PHP3_EXT_DES_CRYPT
+#undef PHP3_MD5_CRYPT
+#undef PHP3_BLOWFISH_CRYPT
+
+/* Define if you have dirent.h but opendir() resides in libc rather than in libdir */
+/* This will cause HAVE_DIRENT_H defined twice sometimes, but it should be problem */
+#define HAVE_DIRENT_H 0
+
+/* Define if you have the resolv library (-lresolv). */
+#define HAVE_LIBRESOLV 0
+
+/* Define if you have the gd library (-lgd). */
+#define HAVE_LIBGD 0
+
+/* Define if you have the zlib library */
+#define HAVE_ZLIB 0
+
+/* Define if you have the gd version 1.3 library (-lgd). */
+#define HAVE_LIBGD13 0
+
+/* Define if you want safe mode enabled by default. */
+#define PHP_SAFE_MODE 0
+
+/* Set to the path to the dir containing safe mode executables */
+#define PHP_SAFE_MODE_EXEC_DIR /usr/local/php/bin
+
+/* Define if you want POST/GET/Cookie track variables by default */
+#define PHP_TRACK_VARS 0
+
+/* Undefine if you want stricter XML/SGML compliance by default */
+/* (this disables "<?expression?>" by default) */
+#define DEFAULT_SHORT_OPEN_TAG 1
+
+/* Undefine if you do not want PHP by default to escape "'" */
+/* in GET/POST/Cookie data */
+#define MAGIC_QUOTES 1
+
+/* Define if you want the logging to go to ndbm/gdbm/flatfile */
+#define LOG_DBM 0
+#define LOG_DBM_DIR "."
+
+/* Define if you want the logging to go to a mysql database */
+#define LOG_MYSQL 0
+
+/* Define if you want the logging to go to a mysql database */
+#define LOG_MSQL 0
+
+/* Define these if you are using an SQL database for logging */
+#define LOG_SQL_HOST ""
+#define LOG_SQL_DB ""
+
+/* Define if you an ndbm compatible library (-ldbm). */
+#define NDBM 0
+
+/* Define if you have the gdbm library (-lgdbm). */
+#define GDBM 0
+
+/* Define both of these if you want the bundled REGEX library */
+#define REGEX 0
+#define HSREGEX 0
+
+/* Define if you want Solid database support */
+#define HAVE_SOLID 0
+
+/* Define if you want to use the supplied dbase library */
+#define DBASE 0
+
+/* Define if you want Hyperwave support */
+#define HYPERWAVE 0
+
+/* Define if you have the crypt() function */
+#define HAVE_CRYPT 1
+
+/* Define if you have the Oracle database client libraries */
+#define HAVE_ORACLE 0
+
+/* Define if you have the Oracle version 8 database client libraries */
+#define HAVE_OCI8 0
+
+/* Define if you want to use the iODBC database driver */
+#define HAVE_IODBC 0
+
+/* Define if you want to use the OpenLink ODBC database driver */
+#define HAVE_OPENLINK 0
+
+/* Define if you have the AdabasD client libraries */
+#define HAVE_ADABAS 0
+
+/* Define if you want the LDAP directory interface */
+#define HAVE_LDAP 0
+
+/* Define if you want the SNMP interface */
+#define HAVE_SNMP 0
+
+/* Define if you want the IMAP directory interface */
+#define HAVE_IMAP 0
+
+/* Define if you want to use a custom ODBC database driver */
+#define HAVE_CODBC 0
+
+/* Define to use the unified ODBC interface */
+#define HAVE_UODBC 0
+
+/* Define if you have libdl (used for dynamic linking) */
+#define HAVE_LIBDL 0
+
+/* Define if you have libdnet_stub (used for Sybase support) */
+#define HAVE_LIBDNET_STUB 0
+
+/* Define if you have and want to use libcrypt */
+#define HAVE_LIBCRYPT 0
+
+/* Define if you have and want to use libnsl */
+#define HAVE_LIBNSL 0
+
+/* Define if you have and want to use libsocket */
+#define HAVE_LIBSOCKET 0
+
+/* Define if you have the sendmail program available */
+#define HAVE_SENDMAIL 0
+
+/* Define if you are compiling PHP as an Apache module */
+#define APACHE 0
+
+/* Define if you are compiling PHP as an Apache module with mod_charset patch applied (aka Russian Apache)*/
+#define USE_TRANSFER_TABLES 0
+
+/* Define if you are compiling PHP as an fhttpd module */
+#define FHTTPD 0
+
+/* Define if your Apache creates an ap_config.h header file (only 1.3b6 and later) */
+#define HAVE_AP_CONFIG_H 0
+
+/* Define if your Apache has src/include/compat.h */
+#define HAVE_OLD_COMPAT_H 0
+
+/* Define if your Apache has src/include/ap_compat.h */
+#define HAVE_AP_COMPAT_H 0
+
+#ifndef HAVE_EMPRESS
+#define HAVE_EMPRESS 0
+#endif
+
+#define HAVE_SYBASE 0
+#define HAVE_SYBASE_CT 0
+
+#ifndef HAVE_MYSQL
+#define HAVE_MYSQL 0
+#endif
+
+#ifndef HAVE_MSQL
+#define HAVE_MSQL 0
+#endif
+
+#ifndef HAVE_PGSQL
+#define HAVE_PGSQL 0
+#endif
+
+#ifndef HAVE_VELOCIS
+#define HAVE_VELOCIS 0
+#endif
+
+#ifndef HAVE_IFX
+#define HAVE_IFX 0
+#endif
+#ifndef HAVE_IFX_IUS
+#define HAVE_IFX_IUS 0
+#endif
+#ifndef IFX_VERSION
+#define IFX_VERSION 0
+#endif
+
+#ifndef HAVE_IBASE
+#define HAVE_IBASE 0
+#endif
+
+#ifndef HAVE_PQCMDTUPLES
+#define HAVE_PQCMDTUPLES 0
+#endif
+
+#define MSQL1 0
+#define HAVE_FILEPRO 0
+#define HAVE_SOLID 0
+#define DEBUG 0
+
+/* Define if your system has the gettimeofday() call */
+#define HAVE_GETTIMEOFDAY 0
+
+/* Define if your system has the putenv() library call */
+#define HAVE_PUTENV 0
+
+/* Define if you want to enable PHP RPC (experimental) */
+#define PHP_RPC 0
+
+/* Define if you want to enable bc style precision math support */
+#define WITH_BCMATH 0
+
+/* Define if you want to prevent the CGI from working unless REDIRECT_STATUS is defined in the environment */
+#define FORCE_CGI_REDIRECT 0
+
+/* Define if you want to prevent the CGI from using path_info and path_translated */
+#define DISCARD_PATH 0
+
+/* Define if you want to enable memory limit support */
+#define MEMORY_LIMIT 0
+
+/* Define if you want include() and other functions to be able to open
+ * http and ftp URLs as files.
+ */
+#define PHP3_URL_FOPEN 0
+
+/* Define if you want System V semaphore support.
+ */
+#define HAVE_SYSVSEM 0
+
+/* Define if you have union semun.
+ */
+#define HAVE_SEMUN 0
+
+/* Define if you want System V shared memory support.
+ */
+#define HAVE_SYSVSHM 0
+
+
+/* Define if you have broken header files like SunOS 4 */
+#define MISSING_FCLOSE_DECL 0
+
+/* Define if you have broken sprintf function like SunOS 4 */
+#define BROKEN_SPRINTF 0
+
+/* Define if you have the expat (XML Parser Toolkit) library */
+#define HAVE_LIBEXPAT 0
+
+/* Define if you have the pdflib library */
+#define HAVE_PDFLIB 0
+
+/* Define if you have the fdftk library */
+#define HAVE_FDFLIB 0
+
+/* Define to compile with mod_dav support */
+#define HAVE_MOD_DAV 0
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..35afb96
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,417 @@
+dnl $Id$
+dnl
+dnl This file contains local autoconf functions.
+
+AC_DEFUN(AC_ORACLE_VERSION,[
+ AC_MSG_CHECKING([Oracle version])
+ if test -f "$ORACLEINST_TOP/orainst/unix.rgs"
+ then
+ ORACLE_VERSION=`grep '"ocommon"' $ORACLEINST_TOP/orainst/unix.rgs | sed 's/[ ][ ]*/:/g' | cut -d: -f 6 | cut -c 2-4`
+ test -z "$ORACLE_VERSION" && ORACLE_VERSION=7.3
+ else
+ ORACLE_VERSION=8.0
+ fi
+ AC_MSG_RESULT($ORACLE_VERSION)
+])
+
+dnl
+dnl Test mSQL version by checking if msql.h has "IDX_TYPE" defined.
+dnl
+AC_DEFUN(AC_MSQL_VERSION,[
+ AC_MSG_CHECKING([mSQL version])
+ ac_php_oldcflags=$CFLAGS
+ CFLAGS="$MSQL_INCLUDE $CFLAGS";
+ AC_TRY_COMPILE([#include <sys/types.h>
+#include "msql.h"],[int i = IDX_TYPE],[
+ AC_DEFINE(MSQL1,0)
+ MSQL_VERSION="2.0 or newer"
+ ],[
+ AC_DEFINE(MSQL1,1)
+ MSQL_VERSION="1.0"
+ ])
+ CFLAGS=$ac_php_oldcflags
+ AC_MSG_RESULT($MSQL_VERSION)
+])
+
+dnl
+dnl Figure out which library file to link with for the Solid support.
+dnl
+AC_DEFUN(AC_FIND_SOLID_LIBS,[
+ AC_MSG_CHECKING([Solid library file])
+ ac_solid_uname_s=`uname -s 2>/dev/null`
+ case $ac_solid_uname_s in
+ AIX) ac_solid_os=a3x;;
+ HP-UX) ac_solid_os=h9x;;
+ IRIX) ac_solid_os=irx;;
+ Linux) ac_solid_os=lux;;
+ SunOS) ac_solid_os=ssx;; # should we deal with SunOS 4?
+ FreeBSD) ac_solid_os=fbx;;
+ # "uname -s" on SCO makes no sense.
+ esac
+ SOLID_LIBS=`echo $1/scl${ac_solid_os}*.so | cut -d' ' -f1`
+ if test ! -f $SOLID_LIBS; then
+ SOLID_LIBS=`echo $1/scl${ac_solid_os}*.a | cut -d' ' -f1`
+ fi
+ if test ! -f $SOLID_LIBS; then
+ SOLID_LIBS=`echo $1/scl2x${ac_solid_os}*.a | cut -d' ' -f1`
+ fi
+ if test ! -f $SOLID_LIBS; then
+ SOLID_LIBS=`echo $1/scl2x${ac_solid_os}*.a | cut -d' ' -f1`
+ fi
+ if test ! -f $SOLID_LIBS; then
+ SOLID_LIBS=`echo $1/bcl${ac_solid_os}*.so | cut -d' ' -f1`
+ fi
+ if test ! -f $SOLID_LIBS; then
+ SOLID_LIBS=`echo $1/bcl${ac_solid_os}*.a | cut -d' ' -f1`
+ fi
+ AC_MSG_RESULT(`echo $SOLID_LIBS | sed -e 's!.*/!!'`)
+])
+
+dnl
+dnl Figure out which library file to link with for the Empress support.
+dnl
+AC_DEFUN(AC_FIND_EMPRESS_LIBS,[
+ AC_MSG_CHECKING([Empress library file])
+ EMPRESS_LIBS=`echo $1/empodbc.so | cut -d' ' -f1`
+ if test ! -f $EMPRESS_LIBS; then
+ EMPRESS_LIBS=`echo $1/empodbc.a | cut -d' ' -f1`
+ fi
+ AC_MSG_RESULT(`echo $EMPRESS_LIBS | sed -e 's!.*/!!'`)
+])
+
+
+dnl
+dnl See if we have broken header files like SunOS has.
+dnl
+AC_DEFUN(AC_MISSING_FCLOSE_DECL,[
+ AC_MSG_CHECKING([for fclose declaration])
+ AC_TRY_COMPILE([#include <stdio.h>],[int (*func)() = fclose],[
+ AC_DEFINE(MISSING_FCLOSE_DECL,0)
+ AC_MSG_RESULT(ok)
+ ],[
+ AC_DEFINE(MISSING_FCLOSE_DECL,1)
+ AC_MSG_RESULT(missing)
+ ])
+])
+
+# Checks for libraries.
+# Prefer gdbm, Berkeley DB and ndbm/dbm, in that order
+AC_DEFUN(AC_PREFERRED_DB_LIB,[
+ AC_CHECK_LIB(gdbm, gdbm_open,[AC_DEFINE(GDBM) DBM_TYPE=gdbm; DBM_LIB=-lgdbm],
+ [AC_CHECK_LIB(db, dbm_open,[AC_DEFINE(NDBM) DBM_TYPE=ndbm; DBM_LIB=-ldb],
+ [AC_CHECK_LIB(c, dbm_open,[AC_DEFINE(NDBM) DBM_TYPE=ndbm; DBM_LIB=],
+ [AC_CHECK_LIB(dbm, dbm_open,[AC_DEFINE(NDBM) DBM_TYPE=ndbm; DBM_LIB=-ldbm],
+ [DBM_TYPE=""])])])])
+ AC_MSG_CHECKING([preferred dbm library])
+ if test "a$DBM_TYPE" = a; then
+ AC_MSG_RESULT(none found)
+ AC_MSG_WARN(No dbm library found - using built-in flatfile support)
+ else
+ AC_MSG_RESULT($DBM_TYPE chosen)
+ fi
+ AC_SUBST(DBM_LIB)
+ AC_SUBST(DBM_TYPE)
+])
+
+dnl
+dnl Check for broken sprintf()
+dnl
+AC_DEFUN(AC_BROKEN_SPRINTF,[
+ AC_MSG_CHECKING([for broken sprintf])
+ AC_TRY_RUN([main() { char buf[20]; exit (sprintf(buf,"testing 123")!=11); }],[
+ AC_DEFINE(BROKEN_SPRINTF,0)
+ AC_MSG_RESULT(ok)
+ ],[
+ AC_DEFINE(BROKEN_SPRINTF,1)
+ AC_MSG_RESULT(broken)
+ ],[
+ AC_DEFINE(BROKEN_SPRINTF,0)
+ AC_MSG_RESULT(cannot check, guessing ok)
+ ])
+])
+
+dnl
+dnl Check for crypt() capabilities
+dnl
+AC_DEFUN(AC_CRYPT_CAP,[
+
+ AC_MSG_CHECKING([for standard DES crypt])
+ AC_TRY_RUN([
+main() {
+#if HAVE_CRYPT
+ exit (strcmp((char *)crypt("rasmuslerdorf","rl"),"rl.3StKT.4T8M"));
+#else
+ exit(0);
+#endif
+}],[
+ AC_DEFINE(PHP3_STD_DES_CRYPT,1)
+ AC_MSG_RESULT(yes)
+ ],[
+ AC_DEFINE(PHP3_STD_DES_CRYPT,0)
+ AC_MSG_RESULT(no)
+ ],[
+ AC_DEFINE(PHP3_STD_DES_CRYPT,1)
+ AC_MSG_RESULT(cannot check, guessing yes)
+ ])
+
+ AC_MSG_CHECKING([for extended DES crypt])
+ AC_TRY_RUN([
+main() {
+#if HAVE_CRYPT
+ exit (strcmp((char *)crypt("rasmuslerdorf","_J9..rasm"),"_J9..rasmBYk8r9AiWNc"));
+#else
+ exit(0);
+#endif
+}],[
+ AC_DEFINE(PHP3_EXT_DES_CRYPT,1)
+ AC_MSG_RESULT(yes)
+ ],[
+ AC_DEFINE(PHP3_EXT_DES_CRYPT,0)
+ AC_MSG_RESULT(no)
+ ],[
+ AC_DEFINE(PHP3_EXT_DES_CRYPT,0)
+ AC_MSG_RESULT(cannot check, guessing no)
+ ])
+
+ AC_MSG_CHECKING([for MD5 crypt])
+ AC_TRY_RUN([
+main() {
+#if HAVE_CRYPT
+ char salt[15], answer[40];
+
+ salt[0]='$'; salt[1]='1'; salt[2]='$';
+ salt[3]='r'; salt[4]='a'; salt[5]='s';
+ salt[6]='m'; salt[7]='u'; salt[8]='s';
+ salt[9]='l'; salt[10]='e'; salt[11]='$';
+ salt[12]='\0';
+ strcpy(answer,salt);
+ strcat(answer,"rISCgZzpwk3UhDidwXvin0");
+ exit (strcmp((char *)crypt("rasmuslerdorf",salt),answer));
+#else
+ exit(0);
+#endif
+}],[
+ AC_DEFINE(PHP3_MD5_CRYPT,1)
+ AC_MSG_RESULT(yes)
+ ],[
+ AC_DEFINE(PHP3_MD5_CRYPT,0)
+ AC_MSG_RESULT(no)
+ ],[
+ AC_DEFINE(PHP3_MD5_CRYPT,0)
+ AC_MSG_RESULT(cannot check, guessing no)
+ ])
+
+ AC_MSG_CHECKING([for Blowfish crypt])
+ AC_TRY_RUN([
+main() {
+#if HAVE_CRYPT
+ char salt[25], answer[70];
+
+ salt[0]='$'; salt[1]='2'; salt[2]='a'; salt[3]='$'; salt[4]='0'; salt[5]='7'; salt[6]='$'; salt[7]='\0';
+ strcat(salt,"rasmuslerd");
+ strcpy(answer,salt);
+ strcpy(&answer[16],"O............gl95GkTKn53Of.H4YchXl5PwvvW.5ri");
+ exit (strcmp((char *)crypt("rasmuslerdorf",salt),answer));
+#else
+ exit(0);
+#endif
+}],[
+ AC_DEFINE(PHP3_BLOWFISH_CRYPT,1)
+ AC_MSG_RESULT(yes)
+ ],[
+ AC_DEFINE(PHP3_BLOWFISH_CRYPT,0)
+ AC_MSG_RESULT(no)
+ ],[
+ AC_DEFINE(PHP3_BLOWFISH_CRYPT,0)
+ AC_MSG_RESULT(cannot check, guessing no)
+ ])
+])
+
+## libtool.m4 - Configure libtool for the target system. -*-Shell-script-*-
+## Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+## Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+##
+## As a special exception to the GNU General Public License, if you
+## distribute this file as part of a program that contains a
+## configuration script generated by Autoconf, you may include it under
+## the same distribution terms that you use for the rest of that program.
+
+# serial 9 AM_PROG_LIBTOOL
+AC_DEFUN(AM_PROG_LIBTOOL,
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_RANLIB])
+AC_REQUIRE([AM_PROG_LD])
+AC_REQUIRE([AC_PROG_LN_S])
+
+# Always use our own libtool.
+LIBTOOL='$(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)
+
+dnl Allow the --disable-shared flag to stop us from building shared libs.
+AC_ARG_ENABLE(shared,
+[ --enable-shared build shared libraries [default=yes]],
+test "$enableval" = no && libtool_shared=" --disable-shared",
+libtool_shared=)
+
+dnl Allow the --disable-static flag to stop us from building static libs.
+AC_ARG_ENABLE(static,
+[ --enable-static build static libraries [default=yes]],
+test "$enableval" = no && libtool_static=" --disable-static",
+libtool_static=)
+
+libtool_flags="$libtool_shared$libtool_static"
+test "$silent" = yes && libtool_flags="$libtool_flags --silent"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+[case "$host" in
+*-*-irix6*)
+ for f in '-32' '-64' '-cckr' '-n32' '-mips1' '-mips2' '-mips3' '-mips4'; do
+ if echo " $CC $CFLAGS " | egrep -e "[ ]$f[ ]" > /dev/null; then
+ LD="${LD-ld} $f"
+ fi
+ done
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ CFLAGS="$CFLAGS -belf"
+ ;;
+esac]
+
+# Actually configure libtool. ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" RANLIB="$RANLIB" LN_S="$LN_S" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
+|| AC_MSG_ERROR([libtool configure failed])
+])
+
+# AM_PROG_LD - find the path to the GNU or non-GNU linker
+AC_DEFUN(AM_PROG_LD,
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+if test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(ac_cv_path_LD,
+[case "$LD" in
+ /*)
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/ld"; then
+ ac_cv_path_LD="$ac_dir/ld"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU ld|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" = yes && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac])
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_SUBST(LD)
+AM_PROG_LD_GNU
+])
+
+AC_DEFUN(AM_PROG_LD_GNU,
+[AC_CACHE_CHECK([whether we are using GNU ld], ac_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU ld|with BFD)' > /dev/null; then
+ ac_cv_prog_gnu_ld=yes
+else
+ ac_cv_prog_gnu_ld=no
+fi])
+])
+
+# the following 'borrwed' from automake until we switch over
+# Add --enable-maintainer-mode option to configure.
+# From Jim Meyering
+
+# serial 1
+
+AC_DEFUN(AM_MAINTAINER_MODE,
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ AC_MSG_RESULT($USE_MAINTAINER_MODE)
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINT=
+ else
+ MAINT='#M#'
+ fi
+ AC_SUBST(MAINT)dnl
+]
+)
+
+# another one stolen from automake temporarily
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN(AM_SANITY_CHECK,
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "$@" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ test "[$]2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
diff --git a/apMakefile.libdir b/apMakefile.libdir
new file mode 100644
index 0000000..7b52540
--- /dev/null
+++ b/apMakefile.libdir
@@ -0,0 +1,4 @@
+This is a place-holder which indicates to Configure that it shouldn't
+provide the default targets when building the Makefile in this directory.
+Instead it'll just prepend all the important variable definitions, and
+copy the Makefile.tmpl onto the end.
diff --git a/apMakefile.tmpl b/apMakefile.tmpl
new file mode 100644
index 0000000..e7ba023
--- /dev/null
+++ b/apMakefile.tmpl
@@ -0,0 +1,77 @@
+##
+## Apache 1.3 Makefile template for PHP3 Module
+## [src/modules/php3/Makefile.tmpl]
+##
+
+# the parametrized target
+LIB=libphp3.$(LIBEXT)
+
+# objects for building the static library
+OBJS=mod_php3.o
+OBJS_LIB=libmodphp3.a
+
+# objects for building the shared object library
+SHLIB_OBJS=mod_php3.so-o
+SHLIB_OBJS_LIB=libmodphp3-so.a
+
+# the general targets
+all: lib
+lib: $(LIB)
+
+# build the static library by merging the object files
+libphp3.a: $(OBJS) $(OBJS_LIB)
+ cp $(OBJS_LIB) $@
+ ar r $@ $(OBJS)
+ $(RANLIB) $@
+
+# ugly hack to support older Apache-1.3 betas that don't set $LIBEXT
+libphp3.: $(OBJS) $(OBJS_LIB)
+ cp $(OBJS_LIB) $@
+ ar r $@ $(OBJS)
+ $(RANLIB) $@
+ cp libphp3. libphp3.a
+
+# build the shared object library by linking the object files
+libphp3.so: $(SHLIB_OBJS) $(SHLIB_OBJS_LIB)
+ rm -f $@
+ $(LD_SHLIB) $(LDFLAGS_SHLIB) -o $@ $(SHLIB_OBJS) $(SHLIB_OBJS_LIB) $(LIBS)
+
+# 1. extension .o for shared objects cannot be used here because
+# first these files aren't still shared objects and second we
+# have to use a different name to trigger the different
+# implicit Make rule
+# 2. extension -so.o (as used elsewhere) cannot be used because
+# the suffix feature of Make really wants just .x, so we use
+# extension .so-o
+.SUFFIXES: .o .so-o
+.c.o:
+ $(CC) -c $(INCLUDES) $(CFLAGS) $(SPACER) $<
+.c.so-o:
+ $(CC) -c $(INCLUDES) $(CFLAGS) $(CFLAGS_SHLIB) $(SPACER) $< && mv $*.o $*.so-o
+
+# cleanup
+clean:
+ -rm -f $(OBJS) $(SHLIB_OBJS) $(LIB)
+
+# We really don't expect end users to use this rule. It works only with
+# gcc, and rebuilds Makefile.tmpl. You have to re-run Configure after
+# using it.
+depend:
+ cp Makefile.tmpl Makefile.tmpl.bak \
+ && sed -ne '1,/^# DO NOT REMOVE/p' Makefile.tmpl > Makefile.new \
+ && gcc -MM $(INCLUDES) $(CFLAGS) *.c >> Makefile.new \
+ && sed -e '1,$$s: $(INCDIR)/: $$(INCDIR)/:g' Makefile.new \
+ > Makefile.tmpl \
+ && rm Makefile.new
+
+#Dependencies
+
+$(OBJS): Makefile
+
+# DO NOT REMOVE
+mod_php3.o: mod_php3.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
+ $(INCDIR)/alloc.h $(INCDIR)/buff.h \
+ $(INCDIR)/http_config.h \
+ $(INCDIR)/http_core.h $(INCDIR)/http_main.h \
+ $(INCDIR)/http_protocol.h $(INCDIR)/http_request.h \
+ $(INCDIR)/http_log.h $(INCDIR)/util_script.h mod_php3.h
diff --git a/apidoc.txt b/apidoc.txt
new file mode 100644
index 0000000..b24961b
--- /dev/null
+++ b/apidoc.txt
@@ -0,0 +1,492 @@
+PHP Version 3.0 API Documentation
+
+Table of Contents
+-----------------
+ 1. Function Prototype
+ 2. Function Arguments
+ 3. Variable number of function arguments
+ 4. Using the function arguments
+ 5. Memory management in functions
+ 6. Setting variables in the symbol table
+ 7. Returning values from functions
+ 8. Returning 'complex' values from functions (arrays or objects)
+ 9. Using the resource list
+10. Using the persistent resource table
+11. Adding runtime configuration directives
+-----------------
+
+1. Function Prototype
+
+ All functions look like this:
+
+ void php3_foo(INTERNAL_FUNCTION_PARAMETERS) {
+
+ }
+
+ Even if your function doesn't take any arguments, this is how it is
+ called.
+
+-----------------
+
+2. Function Arguments
+
+ Arguments are always of type pval. This type contains a union which
+ has the actual type of the argument. So, if your function takes two
+ arguments, you would do something like the following at the top of your
+ function:
+
+ pval *arg1, *arg2;
+ if (ARG_COUNT(ht) != 2 || getParameters(ht,2,&arg1,&arg2)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+ NOTE: Arguments can be passed either by value or by reference. In both
+ cases you will need to pass &(pval *) to getParameters. If you want to
+ check if the n'th parameter was sent to you by reference or not, you can
+ use the function, ParameterPassedByReference(ht,n). It will return either
+ 1 or 0.
+
+ When you change any of the passed parameters, whether they are sent by
+ reference or by value, you can either start over with the parameter by
+ calling pval_destructor on it, or if it's an ARRAY you want to add to,
+ you can use functions similar to the ones in internal_functions.h which
+ manipulate return_value as an ARRAY.
+
+ Also if you change a parameter to IS_STRING make sure you first assign
+ the new estrdup'ed string and the string length, and only later change the
+ type to IS_STRING. If you change the string of a parameter which already
+ IS_STRING or IS_ARRAY you should run pval_destructor on it first.
+
+-----------------
+
+3. Variable number of function arguments
+
+ A function can take a variable number of arguments. If your function can
+ take either 2 or 3 arguments, use the following:
+
+ pval *arg1, *arg2, *arg3;
+ int arg_count = ARG_COUNT(ht);
+
+ if (arg_count<2 || arg_count>3 ||
+ getParameters(ht,arg_count,&arg1,&arg2,&arg3)==FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+
+------------------
+
+4. Using the function arguments
+
+ The type of each argument is stored in the pval type field:
+
+
+ This type can be any of the following:
+
+ IS_STRING String
+ IS_DOUBLE Double-precision floating point
+ IS_LONG Long
+ IS_ARRAY Array
+
+ IS_EMPTY ??
+ IS_USER_FUNCTION ??
+ IS_INTERNAL_FUNCTION ?? (if some of these cannot be passed to a
+ function - delete)
+ IS_CLASS ??
+ IS_OBJECT ??
+
+ If you get an argument of one type and would like to use it as another,
+ or if you just want to force the argument to be of a certain type, you
+ can use one of the following conversion functions:
+
+ convert_to_long(arg1);
+ convert_to_double(arg1);
+ convert_to_string(arg1);
+ convert_to_boolean_long(arg1); If the string is "" or "0" it
+ becomes 0, 1 otherwise
+ convert_string_to_number(arg1); Converts string to either LONG or
+ DOUBLE depending on string
+
+ These function all do in-place conversion. They do not return anything.
+
+ The actual argument is stored in a union.
+
+ For type IS_STRING, use arg1->value.str.val
+ IS_LONG arg1->value.lval
+ IS_DOUBLE arg1->value.dval
+
+-------------------
+
+5. Memory management in functions
+
+ Any memory needed by a function should be allocated with either emalloc()
+ or estrdup(). These are memory handling abstraction functions that look
+ and smell like the normal malloc() and strdup() functions. Memory should
+ be freed with efree().
+
+ There are two kinds of memory in this program. Memory which is returned
+ to the parser in a variable and memory which you need for temporary
+ storage in your internal function. When you assign a string to a
+ variable which is returned to the parser you need to make sure you first
+ allocate the memory with either emalloc or estrdup. This memory
+ should NEVER be freed by you, unless you later, in the same function
+ overwrite your original assignment (this kind of programming practice is
+ not good though).
+
+ For any temporary/permanent memory you need in your functions/library you
+ should use the three emalloc(), estrdup(), and efree() functions. They
+ behave EXACTLY like their counterpart functions. Anything you emalloc()
+ or estrdup() you have to efree() at some point or another, unless it's
+ supposed to stick around until the end of the program, otherwise there
+ will be a memory leak. The meaning of "the functions behave exactly like
+ their counterparts" is if you efree() something which was not
+ emalloc()'ed nor estrdup()'ed you might get a segmentation fault. So
+ please take care and free all of your wasted memory. One of the biggest
+ improvements in PHP 3.0 will hopefully be the memory management.
+
+ If you compile with "-DDEBUG", PHP3 will print out a list of all
+ memory that was allocated using emalloc() and estrdup() but never
+ freed with efree() when it is done running the specified script.
+
+-------------------
+
+6. Setting variables in the symbol table
+
+ A number of macros are available which make it easier to set a variable
+ in the symbol table:
+
+ SET_VAR_STRING(name,value) **
+ SET_VAR_DOUBLE(name,value)
+ SET_VAR_LONG(name,value)
+
+ ** Be careful here. The value part must be malloc'ed manually because
+ the memory management code will try to free this pointer later. Do
+ not pass statically allocated memory into a SET_VAR_STRING
+
+ Symbol tables in PHP 3.0 are implemented as hash tables. At any given time,
+ &symbol_table is a pointer to the 'main' symbol table, and active_symbol_table
+ points to the currently active symbol table (these may be identical like in
+ startup, or different, if you're inside a function).
+
+ The following examples use 'active_symbol_table'. You should replace it with
+ &symbol_table if you specifically want to work with the 'main' symbol table.
+ Also, the same funcions may be applied to arrays, as explained below.
+
+ * To check whether a variable named $foo already exists in a symbol table:
+ if (hash_exists(active_symbol_table,"foo",sizeof("foo"))) { exists... }
+ else { doesn't exist }
+
+ * If you also need to get the type of the variable, you can use:
+ hash_find(active_symbol_table,"foo",sizeof("foo"),&pvalue);
+ check(pvalue.type);
+
+ Arrays in PHP 3.0 are implemented using the same hashtables as symbol tables.
+ This means the two above functions can also be used to check variables
+ inside arrays.
+
+ If you want to define a new array in a symbol table, you should do this:
+
+ 1. Possibly check it exists and abort, using hash_exists()
+ or hash_find().
+ 2. Code:
+
+ pval arr;
+
+ if (array_init(&arr) == FAILURE) { failed... };
+ hash_update(active_symbol_table,"foo",sizeof("foo"),&arr,sizeof(pval),NULL);
+
+ This code declares a new array, named $foo, in the active symbol table.
+ This array is empty.
+
+ Here's how to add new entries to it:
+
+ pval entry;
+
+ entry.type = IS_LONG;
+ entry.value.lval = 5;
+
+ hash_update(arr.value.ht,"bar",sizeof("bar"),&entry,sizeof(pval),NULL); /* defines $foo["bar"] = 5 */
+ hash_index_update(arr.value.ht,7,&entry,sizeof(pval),NULL); /* defines $foo[7] = 5 */
+ hash_next_index_insert(arr.value.ht,&entry,sizeof(pval),NULL); /* defines the next free place in $foo[],
+ * $foo[8], to be 5 (works like php2)
+ */
+
+ If you'd like to modify a value that you inserted to a hash, you must first retreive it from the hash. To
+ prevent that overhead, you can supply a pval ** to the hash add function, and it'll be updated with the
+ pval * address of the inserted element inside the hash. If that value is NULL (like in all of the
+ above examples) - that parameter is ignored.
+
+ hash_next_index_insert() works more or less using the same logic
+ "$foo[] = bar;" works in PHP 2.0.
+
+ If you are building an array to return from a function, you can initialize
+ the array just like above by doing:
+
+ if (array_init(return_value) == FAILURE) { failed...; }
+
+ and then adding values with the helper functions:
+
+ add_next_index_long(return_value,long_value);
+ add_next_index_double(return_value,double_value);
+ add_next_index_string(return_value,estrdup(string_value));
+
+ Of course, if the adding isn't done right after the array
+ initialization, you'd probably have to look for the array first:
+
+ pval *arr;
+
+ if (hash_find(active_symbol_table,"foo",sizeof("foo"),(void **)&arr)==FAILURE) { can't find... }
+ else { use arr->value.ht... }
+
+ Note that hash_find receives a pointer to a pval pointer, and
+ not a pval pointer.
+
+ Just about any hash function returns SUCCESS or FAILURE (except for
+ hash_exists() that returns a boolean truth value).
+
+-------------------
+
+7. Returning 'simple' values from functions (integers, floats or strings)
+
+ A number of macros are available to make it easier to return things from
+ functions:
+
+ These set the return value and return from the function:
+
+ RETURN_FALSE
+ RETURN_TRUE
+ RETURN_LONG(l)
+ RETURN_STRING(s,dup) If dup is true, duplicates the string
+ RETURN_STRINGL(s,l,dup) Return string (s) specifying length (l).
+ RETURN_DOUBLE(d)
+
+ These only set the return value:
+
+ RETVAL_FALSE
+ RETVAL_TRUE
+ RETVAL_LONG(l)
+ RETVAL_STRING(s,dup) If dup is true, duplicates the string
+ RETVAL_STRINGL(s,l,dup) Return string (s) specifying length (l).
+ RETVAL_DOUBLE(d)
+
+ The string macros above will all estrdup() the passed 's' argument,
+ so you can safely free the argument after calling the macro, or
+ alternatively use statically allocated memory.
+
+ If your function returns boolean success/error responses, always use
+ RETURN_TRUE and RETURN_FALSE respectively.
+
+-------------------
+
+8. Returning 'complex' values from functions (arrays or objects)
+
+ Your function can also return a complex data type such as an object
+ or an array.
+
+ Returning an object:
+
+ 1. Call object_init(return_value).
+ 2. Fill it up with values:
+
+ add_property_long(return_value,property_name,l) Add a property named 'property_name', of type long, equals to 'l'
+ add_property_double(return_value,property_name,d) Same, only a double
+ add_property_string(return_value,property_name,str) Same, only a string
+ add_property_stringl(return_value,property_name,str,l) Add a property named 'property_name', of type string, string is 'str' with length 'l'
+
+ 3. Possibly, register functions for this object. In order to
+ obtain values from the object, the function would have to fetch
+ "this" from the active_symbol_table. Its type should be IS_OBJECT,
+ and it's basically a regular hash table (i.e., you can use regular
+ hash functions on .value.ht). The actual registration of the
+ function can be done using:
+
+ add_method(return_value,function_name,function_ptr)
+
+
+ Returning an array:
+
+ 1. Call array_init(return_value).
+ 2. Fill it up with values:
+
+ add_assoc_long(return_value,key,l) add associative entry with key 'key' and long value 'l'
+ add_assoc_double(return_value,key,d)
+ add_assoc_string(return_value,key,str)
+ add_assoc_stringl(return_value,key,str,length) specify the string length
+
+ add_index_long(return_value,index,l) add entry in index 'index' with long value 'l'
+ add_index_double(return_value,index,d)
+ add_index_string(return_value,index,str)
+ add_index_stringl(return_value,index,str,length) specify the string length
+
+ add_next_index_long(return_value,l) add an array entry in the next free offset with long value 'l'
+ add_next_index_double(return_value,d)
+ add_next_index_string(return_value,str)
+ add_next_index_stringl(return_value,str,length) specify the string length
+
+-------------------
+
+9. Using the resource list
+
+ PHP 3.0 has a standard way of dealing with various types of resources,
+ that replaces all of the local linked lists in PHP 2.0.
+
+ Available functions:
+
+ php3_list_insert(ptr, type) returns the 'id' of the newly inserted resource
+ php3_list_delete(id) delete the resource with the specified id
+ php3_list_find(id,*type) returns the pointer of the resource with the specified id, updates 'type' to the resource's type
+
+ Typically, these functions are used for SQL drivers but they can be
+ used for anything else, and are used, for instance, for maintaining
+ file descriptors.
+
+ Typical list code would look like this:
+
+ Adding a new resource:
+
+ RESOURCE *resource;
+
+ ...allocate memory for resource and acquire resource...
+ /* add a new resource to the list */
+ return_value->value.lval = php3_list_insert((void *) resource, LE_RESOURCE_TYPE);
+ return_value->type = IS_LONG;
+
+ Using an existing resource:
+
+ pval *resource_id;
+ RESOURCE *resource;
+ int type;
+
+ convert_to_long(resource_id);
+ resource = php3_list_find(resource_id->value.lval, &type);
+ if (type != LE_RESOURCE_TYPE) {
+ php3_error(E_WARNING,"resource index %d has the wrong type",resource_id->value.lval);
+ RETURN_FALSE;
+ }
+ ...use resource...
+
+ Deleting an existing resource:
+
+ pval *resource_id;
+ RESOURCE *resource;
+ int type;
+
+ convert_to_long(resource_id);
+ php3_list_delete(resource_id->value.lval);
+
+
+ The resource types should be registered in php3_list.h, in enum
+ list_entry_type. In addition, one should add shutdown code for any
+ new resource type defined, in list.c's list_entry_destructor() (even if
+ you don't have anything to do on shutdown, you must add an empty case).
+
+-------------------
+
+10. Using the persistent resource table
+
+ PHP 3.0 has a standard way of storing persistent resources (i.e.,
+ resources that are kept in between hits). The first module to use
+ this feature was the MySQL module, and mSQL followed it, so one can
+ get the general impression of how a persistent resource should be
+ used by reading mysql.c. The functions you should look at are:
+ php3_mysql_do_connect()
+ php3_mysql_connect()
+ php3_mysql_pconnect()
+
+ The general idea of persistence modules is this:
+ 1. Code all of your module to work with the regular resource list
+ mentioned in section (9).
+ 2. Code extra connect functions that check if the resource already
+ exists in the persistent resource list. If it does, register it
+ as in the regular resource list as a pointer to the persistent
+ resource list (because of 1., the rest of the code
+ should work immediately). If it doesn't, then create it, add it
+ to the persistent resource list AND add a pointer to it from the
+ regular resource list, so all of the code would work since it's
+ in the regular resource list, but on the next connect, the
+ resource would be found in the persistent resource list and be
+ used without having to recreate it.
+ You should register these resources with a different type (e.g.
+ LE_MYSQL_LINK for non-persistent link and LE_MYSQL_PLINK for
+ a persistent link).
+
+ If you read mysql.c, you'll notice that except for the more complex
+ connect function, nothing in the rest of the module has to be changed.
+
+ The very same interface exists for the regular resource list and the
+ persistent resource list, only 'list' is replaced with 'plist':
+
+ php3_plist_insert(ptr, type) returns the 'id' of the newly inserted resource
+ php3_plist_delete(id) delete the resource with the specified id
+ php3_plist_find(id,*type) returns the pointer of the resource with the specified id, updates 'type' to the resource's type
+
+ However, it's more than likely that these functions would prove
+ to be useless for you when trying to implement a persistent module.
+ Typically, one would want to use the fact that the persistent resource
+ list is really a hash table. For instance, in the MySQL/mSQL modules,
+ when there's a pconnect() call (persistent connect), the function
+ builds a string out of the host/user/passwd that were passed to the
+ function, and hashes the SQL link with this string as a key. The next
+ time someone calls a pconnect() with the same host/user/passwd, the
+ same key would be generated, and the function would find the SQL link
+ in the persistent list.
+
+ Until further documented, you should look at mysql.c or msql.c to
+ see how one should use the plist's hash table abilities.
+
+ One important thing to note: resources going into the persistent
+ resource list must *NOT* be allocated with PHP's memory manager, i.e.,
+ they should NOT be created with emalloc(), estrdup(), etc. Rather,
+ one should use the regular malloc(), strdup(), etc. The reason for
+ this is simple - at the end of the request (end of the hit), every
+ memory chunk that was allocated using PHP's memory manager is deleted.
+ Since the persistent list isn't supposed to be erased at the end
+ of a request, one mustn't use PHP's memory manager for allocating
+ resources that go to it.
+
+ Shutting down persistent resources:
+
+ When you register resource that's going to be in the persistent list,
+ you should add destructors to it both in the non-persistent list
+ and in the persistent list.
+ The destructor in the non-persistent list destructor shouldn't do anything.
+ The one in the persistent list destructor should properly free any
+ resources obtained by that type (e.g. memory, SQL links, etc). Just like
+ with the non-persistent resources, you *MUST* add destructors for every
+ resource, even it requires no destructotion and the destructor would
+ be empty.
+ Remember, since emalloc() and friends aren't to be used in conjunction
+ with the persistent list, you mustn't use efree() here either.
+
+-------------------
+
+11. Adding runtime configuration directives
+
+Many of the features of PHP3 can be configured at runtime. These
+configuration directives can appear in either the designated php3.ini
+file, or in the case of the Apache module version in the Apache .conf
+files. The advantage of having them in the Apache .conf files is that
+they can be configured on a per-directory basis. This means that one
+directory may have a certain safemodeexecdir for example, while another
+directory may have another. This configuration granularity is especially
+handy when a server supports multiple virtual hosts.
+
+The steps required to add a new directive:
+
+ 1. Add directive to php3_ini_structure struct in mod_php3.h.
+
+ 2. In main.c, edit the php3_module_startup function and add the
+ appropriate cfg_get_string() or cfg_get_long() call.
+
+ 3. Add the directive, restrictions and a comment to the php3_commands
+ structure in mod_php3.c. Note the restrictions part. RSRC_CONF are
+ directives that can only be present in the actual Apache .conf files.
+ Any OR_OPTIONS directives can be present anywhere, include normal
+ .htaccess files.
+
+ 4. In either php3take1handler() or php3flaghandler() add the appropriate
+ entry for your directive.
+
+ 5. In the configuration section of the _php3_info() function in
+ functions/info.c you need to add your new directive.
+
+ 6. And last, you of course have to use your new directive somewhere.
+ It will be addressable as php3_ini.directive
diff --git a/bison.simple b/bison.simple
new file mode 100644
index 0000000..4e27582
--- /dev/null
+++ b/bison.simple
@@ -0,0 +1,705 @@
+/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+#line 3 "bison.simple"
+
+/* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
+
+ 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, 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. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+#ifndef alloca
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not GNU C. */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
+#include <alloca.h>
+#else /* not sparc */
+#if defined (MSDOS) && !defined (__TURBOC__)
+#include <malloc.h>
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+#include <malloc.h>
+ #pragma alloca
+#else /* not MSDOS, __TURBOC__, or _AIX */
+#ifdef __hpux
+#ifdef __cplusplus
+extern "C" {
+void *alloca (unsigned int);
+};
+#else /* not __cplusplus */
+void *alloca ();
+#endif /* not __cplusplus */
+#endif /* __hpux */
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc. */
+#endif /* not GNU C. */
+#endif /* alloca not defined. */
+
+/* This is the parser code that is written into each bison parser
+ when the %semantic_parser declaration is not specified in the grammar.
+ It was written by Richard Stallman by simplifying the hairy parser
+ used when %semantic_parser is specified. */
+
+/* Note: there must be only one dollar sign in this file.
+ It is replaced by the list of actions, each action
+ as one case of the switch. */
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYACCEPT return(0)
+#define YYABORT return(1)
+#define YYERROR goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+ This remains here temporarily to ease the
+ transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+#define YYFAIL goto yyerrlab
+#define YYRECOVERING() (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { yychar = (token), yylval = (value); \
+ yychar1 = YYTRANSLATE (yychar); \
+ YYPOPSTACK; \
+ goto yybackup; \
+ } \
+ else \
+ { yyerror ("syntax error: cannot back up"); YYERROR; } \
+while (0)
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+#ifndef YYPURE
+#define YYLEX yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX yylex(&yylval, YYLEX_PARAM)
+#else
+#ifdef PHP3_THREAD_SAFE /* PHP 3 Specific useage */
+#define YYLEX yylex(&yylval,php3_globals,php_gbl)
+#else
+#define YYLEX yylex(&yylval)
+#endif /* not using tls */
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int yychar; /* the lookahead symbol */
+YYSTYPE yylval; /* the semantic value of the */
+ /* lookahead symbol */
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc; /* location data for the lookahead */
+ /* symbol */
+#endif
+
+int yynerrs; /* number of parse errors so far */
+#endif /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug; /* nonzero means print parse trace */
+/* Since this is uninitialized, it does not stop multiple parsers
+ from coexisting. */
+#endif
+
+/* YYINITDEPTH indicates the initial size of the parser's stacks */
+
+#ifndef YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH is the maximum size the stacks can grow to
+ (effective only if the built-in stack extension method is used). */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Prevent warning if -Wstrict-prototypes. */
+#ifdef __GNUC__
+/* int yyparse (void); */
+#endif
+
+#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
+#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT)
+#else /* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+static void
+__yy_memcpy (to, from, count)
+ char *to;
+ char *from;
+ int count;
+{
+ register char *f = from;
+ register char *t = to;
+ register int i = count;
+
+ while (i-- > 0)
+ *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+static void
+__yy_memcpy (char *to, char *from, int count)
+{
+ register char *f = from;
+ register char *t = to;
+ register int i = count;
+
+ while (i-- > 0)
+ *t++ = *f++;
+}
+
+#endif
+#endif
+
+#line 196 "bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ into yyparse. The argument should have type void *.
+ It should actually point to an object.
+ Grammar actions can access the variable by casting it
+ to the proper pointer type. */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+#ifndef TLS_VARS
+#define TLS_VARS
+#endif
+#ifndef YY_TLS_VARS
+#define YY_TLS_VARS
+#endif
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+ YYPARSE_PARAM_DECL
+{
+ register int yystate;
+ register int yyn;
+ register short *yyssp;
+ register YYSTYPE *yyvsp;
+ int yyerrstatus; /* number of tokens to shift before error messages enabled */
+ int yychar1 = 0; /* lookahead token as an internal (translated) token number */
+
+ short yyssa[YYINITDEPTH]; /* the state stack */
+ YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
+
+ short *yyss = yyssa; /* refer to the stacks thru separate pointers */
+ YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+ YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
+ YYLTYPE *yyls = yylsa;
+ YYLTYPE *yylsp;
+
+#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK (yyvsp--, yyssp--)
+#endif
+
+ int yystacksize = YYINITDEPTH;
+
+#ifdef YYPURE
+ int yychar;
+ YYSTYPE yylval;
+ int yynerrs;
+#ifdef YYLSP_NEEDED
+ YYLTYPE yylloc;
+#endif
+#endif
+
+ YYSTYPE yyval; /* the variable used to return */
+ /* semantic values from the action */
+ /* routines */
+
+ int yylen;
+ YY_TLS_VARS;
+ TLS_VARS;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Starting parse\n");
+#endif
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss - 1;
+ yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+ yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in yystate . */
+/* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks. */
+yynewstate:
+
+ *++yyssp = yystate;
+
+ if (yyssp >= yyss + yystacksize - 1)
+ {
+ /* Give user a chance to reallocate the stack */
+ /* Use copies of these so that the &'s don't force the real ones into memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+ YYLTYPE *yyls1 = yyls;
+#endif
+
+ /* Get the current used size of the three stacks, in elements. */
+ int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ /* Each stack pointer address is followed by the size of
+ the data in use in that stack, in bytes. */
+#ifdef YYLSP_NEEDED
+ /* This used to be a conditional around just the two extra args,
+ but that might be undefined if yyoverflow is a macro. */
+ yyoverflow("parser stack overflow",
+ &yyss1, size * sizeof (*yyssp),
+ &yyvs1, size * sizeof (*yyvsp),
+ &yyls1, size * sizeof (*yylsp),
+ &yystacksize);
+#else
+ yyoverflow("parser stack overflow",
+ &yyss1, size * sizeof (*yyssp),
+ &yyvs1, size * sizeof (*yyvsp),
+ &yystacksize);
+#endif
+
+ yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+ yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+ /* Extend the stack our own way. */
+ if (yystacksize >= YYMAXDEPTH)
+ {
+ yyerror("parser stack overflow");
+ return 2;
+ }
+ yystacksize *= 2;
+ if (yystacksize > YYMAXDEPTH)
+ yystacksize = YYMAXDEPTH;
+ yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+ __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
+ yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+ __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+ yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+ __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+ yyssp = yyss + size - 1;
+ yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+ yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+ if (yyssp >= yyss + yystacksize - 1)
+ YYABORT;
+ }
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+ goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state. */
+/* Read a lookahead token if we need one and don't already have one. */
+/* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* yychar is either YYEMPTY or YYEOF
+ or a valid token in external form. */
+
+ if (yychar == YYEMPTY)
+ {
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Reading a token: ");
+#endif
+ yychar = YYLEX;
+ }
+
+ /* Convert token to internal form (in yychar1) for indexing tables with */
+
+ if (yychar <= 0) /* This means end of input. */
+ {
+ yychar1 = 0;
+ yychar = YYEOF; /* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Now at end of input.\n");
+#endif
+ }
+ else
+ {
+ yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+ /* Give the individual parser a way to print the precise meaning
+ of a token, for further debugging info. */
+#ifdef YYPRINT
+ YYPRINT (stderr, yychar, yylval);
+#endif
+ fprintf (stderr, ")\n");
+ }
+#endif
+ }
+
+ yyn += yychar1;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+ goto yydefault;
+
+ yyn = yytable[yyn];
+
+ /* yyn is what to do for this token type in this state.
+ Negative => reduce, -yyn is rule number.
+ Positive => shift, yyn is new state.
+ New state is final state => don't bother to shift,
+ just return success.
+ 0, or most negative number => error. */
+
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrlab;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Shift the lookahead token. */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+ /* Discard the token being shifted unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ /* count tokens shifted since error; after three, turn off error status. */
+ if (yyerrstatus) yyerrstatus--;
+
+ yystate = yyn;
+ goto yynewstate;
+
+/* Do the default action for the current state. */
+yydefault:
+
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+
+/* Do a reduction. yyn is the number of a rule to reduce with. */
+yyreduce:
+ yylen = yyr2[yyn];
+ if (yylen > 0)
+ yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ int i;
+
+ fprintf (stderr, "Reducing via rule %d (line %d), ",
+ yyn, yyrline[yyn]);
+
+ /* Print the symbols being reduced, and their result. */
+ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+ fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+ fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+ }
+#endif
+
+$ /* the action file gets copied in in place of this dollarsign */
+#line 498 "bison.simple"
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+ yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ short *ssp1 = yyss - 1;
+ fprintf (stderr, "state stack now");
+ while (ssp1 != yyssp)
+ fprintf (stderr, " %d", *++ssp1);
+ fprintf (stderr, "\n");
+ }
+#endif
+
+ *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+ yylsp++;
+ if (yylen == 0)
+ {
+ yylsp->first_line = yylloc.first_line;
+ yylsp->first_column = yylloc.first_column;
+ yylsp->last_line = (yylsp-1)->last_line;
+ yylsp->last_column = (yylsp-1)->last_column;
+ yylsp->text = 0;
+ }
+ else
+ {
+ yylsp->last_line = (yylsp+yylen-1)->last_line;
+ yylsp->last_column = (yylsp+yylen-1)->last_column;
+ }
+#endif
+
+ /* Now "shift" the result of the reduction.
+ Determine what state that goes to,
+ based on the state we popped back to
+ and the rule number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+ if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTBASE];
+
+ goto yynewstate;
+
+yyerrlab: /* here on detecting error */
+
+ if (! yyerrstatus)
+ /* If not already recovering from an error, report this error. */
+ {
+ ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+ yyn = yypact[yystate];
+
+ if (yyn > YYFLAG && yyn < YYLAST)
+ {
+ int size = 0;
+ char *msg;
+ int x, count;
+
+ count = 0;
+ /* Start X at -yyn if nec to avoid negative indexes in yycheck. */
+ for (x = (yyn < 0 ? -yyn : 0);
+ x < (sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ size += strlen(yytname[x]) + 15, count++;
+ msg = (char *) malloc(size + 15);
+ if (msg != 0)
+ {
+ strcpy(msg, "parse error");
+
+ if (count < 5)
+ {
+ count = 0;
+ for (x = (yyn < 0 ? -yyn : 0);
+ x < (sizeof(yytname) / sizeof(char *)); x++)
+ if (yycheck[x + yyn] == x)
+ {
+ strcat(msg, count == 0 ? ", expecting `" : " or `");
+ strcat(msg, yytname[x]);
+ strcat(msg, "'");
+ count++;
+ }
+ }
+ yyerror(msg);
+ free(msg);
+ }
+ else
+ yyerror ("parse error; also virtual memory exceeded");
+ }
+ else
+#endif /* YYERROR_VERBOSE */
+ yyerror("parse error");
+ }
+
+ goto yyerrlab1;
+yyerrlab1: /* here on error raised explicitly by an action */
+
+ if (yyerrstatus == 3)
+ {
+ /* if just tried and failed to reuse lookahead token after an error, discard it. */
+
+ /* return failure if at end of input */
+ if (yychar == YYEOF)
+ YYABORT;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+ yychar = YYEMPTY;
+ }
+
+ /* Else will try to reuse lookahead token
+ after shifting the error token. */
+
+ yyerrstatus = 3; /* Each real token shifted decrements this */
+
+ goto yyerrhandle;
+
+yyerrdefault: /* current state does not do anything special for the error token. */
+
+#if 0
+ /* This is wrong; only states that explicitly want error tokens
+ should shift them. */
+ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
+ if (yyn) goto yydefault;
+#endif
+
+yyerrpop: /* pop the current state because it cannot handle the error token */
+
+ if (yyssp == yyss) YYABORT;
+ yyvsp--;
+ yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+ yylsp--;
+#endif
+
+#if YYDEBUG != 0
+ if (yydebug)
+ {
+ short *ssp1 = yyss - 1;
+ fprintf (stderr, "Error: state stack now");
+ while (ssp1 != yyssp)
+ fprintf (stderr, " %d", *++ssp1);
+ fprintf (stderr, "\n");
+ }
+#endif
+
+yyerrhandle:
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yyerrdefault;
+
+ yyn += YYTERROR;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+ goto yyerrdefault;
+
+ yyn = yytable[yyn];
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrpop;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrpop;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+#if YYDEBUG != 0
+ if (yydebug)
+ fprintf(stderr, "Shifting error token, ");
+#endif
+
+ *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ yystate = yyn;
+ goto yynewstate;
+}
diff --git a/build-defs.h.in b/build-defs.h.in
new file mode 100644
index 0000000..4197077
--- /dev/null
+++ b/build-defs.h.in
@@ -0,0 +1,85 @@
+/* -*- C -*-
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Stig Sæther Bakken <ssb@guardian.no> |
+ +----------------------------------------------------------------------+
+ */
+
+#define PHP_ADA_INCLUDE "@ADA_INCLUDE@"
+#define PHP_ADA_LFLAGS "@ADA_LFLAGS@"
+#define PHP_ADA_LIBS "@ADA_LIBS@"
+#define PHP_APACHE_INCLUDE "@APACHE_INCLUDE@"
+#define PHP_APACHE_TARGET "@APACHE_TARGET@"
+#define PHP_FHTTPD_INCLUDE "@FHTTPD_INCLUDE@"
+#define PHP_FHTTPD_LIB "@FHTTPD_LIB@"
+#define PHP_FHTTPD_TARGET "@FHTTPD_TARGET@"
+#define PHP_BINNAME "@BINNAME@"
+#define PHP_CFLAGS "@CFLAGS@"
+#define PHP_DBASE_LIB "@DBASE_LIB@"
+#define PHP_DEBUG "@PHP_DEBUG@"
+#define PHP_GDBM_INCLUDE "@GDBM_INCLUDE@"
+#define PHP_HSREGEX "@HSREGEX@"
+#define PHP_IBASE_INCLUDE "@IBASE_INCLUDE@"
+#define PHP_IBASE_LFLAGS "@IBASE_LFLAGS@"
+#define PHP_IBASE_LIBS "@IBASE_LIBS@"
+#define PHP_IFX_INCLUDE "@IFX_INCLUDE@"
+#define PHP_IFX_LFLAGS "@IFX_LFLAGS@"
+#define PHP_IFX_LIBS "@IFX_LIBS@"
+#define PHP_INSTALL_IT "@INSTALL_IT@"
+#define PHP_IODBC_INCLUDE "@IODBC_INCLUDE@"
+#define PHP_IODBC_LFLAGS "@IODBC_LFLAGS@"
+#define PHP_IODBC_LIBS "@IODBC_LIBS@"
+#define PHP_MSQL_INCLUDE "@MSQL_INCLUDE@"
+#define PHP_MSQL_LFLAGS "@MSQL_LFLAGS@"
+#define PHP_MSQL_LIBS "@MSQL_LIBS@"
+#define PHP_MYSQL_INCLUDE "@MYSQL_INCLUDE@"
+#define PHP_MYSQL_LFLAGS "@MYSQL_LFLAGS@"
+#define PHP_MYSQL_LIBS "@MYSQL_LIBS@"
+#define PHP_ORACLE_HOME "@ORACLE_HOME@"
+#define PHP_ORACLE_INCLUDE "@ORACLE_INCLUDE@"
+#define PHP_ORACLE_LFLAGS "@ORACLE_LFLAGS@"
+#define PHP_ORACLE_LIBS "@ORACLE_LIBS@"
+#define PHP_ORACLE_SHLIBS "@ORACLE_SHLIBS@"
+#define PHP_ORACLE_STLIBS "@ORACLE_STLIBS@"
+#define PHP_ORACLE_VERSION "@ORACLE_VERSION@"
+#define PHP_PGSQL_INCLUDE "@PGSQL_INCLUDE@"
+#define PHP_PGSQL_LFLAGS "@PGSQL_LFLAGS@"
+#define PHP_PGSQL_LIBS "@PGSQL_LIBS@"
+#define PHP_PROG_SENDMAIL "@PROG_SENDMAIL@"
+#define PHP_REGEX_LIB "@REGEX_LIB@"
+#define PHP_SOLID_INCLUDE "@SOLID_INCLUDE@"
+#define PHP_SOLID_LIBS "@SOLID_LIBS@"
+#define PHP_EMPRESS_INCLUDE "@EMPRESS_INCLUDE@"
+#define PHP_EMPRESS_LIBS "@EMPRESS_LIBS@"
+#define PHP_SYBASE_INCLUDE "@SYBASE_INCLUDE@"
+#define PHP_SYBASE_LFLAGS "@SYBASE_LFLAGS@"
+#define PHP_SYBASE_LIBS "@SYBASE_LIBS@"
+#define PHP_DBM_TYPE "@DBM_TYPE@"
+#define PHP_DBM_LIB "@DBM_LIB@"
+#define PHP_LDAP_LFLAGS "@LDAP_LFLAGS@"
+#define PHP_LDAP_INCLUDE "@LDAP_INCLUDE@"
+#define PHP_LDAP_LIBS "@LDAP_LIBS@"
+#define PHP_VELOCIS_INCLUDE "@VELOCIS_INCLUDE@"
+#define PHP_VELOCIS_LIBS "@VELOCIS_LIBS@"
diff --git a/calendar.mak b/calendar.mak
new file mode 100644
index 0000000..f82afc2
--- /dev/null
+++ b/calendar.mak
@@ -0,0 +1,244 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on calendar.dsp
+!IF "$(CFG)" == ""
+CFG=calendar - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to calendar - Win32 Debug.
+!ENDIF
+
+!IF "$(CFG)" != "calendar - Win32 Release" && "$(CFG)" != "calendar - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "calendar.mak" CFG="calendar - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "calendar - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "calendar - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+!IF "$(CFG)" == "calendar - Win32 Release"
+
+OUTDIR=.\module_release
+INTDIR=.\module_release
+# Begin Custom Macros
+OutDir=.\module_release
+# End Custom Macros
+
+ALL : "$(OUTDIR)\php3_calendar.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\calendar.obj"
+ -@erase "$(INTDIR)\dow.obj"
+ -@erase "$(INTDIR)\french.obj"
+ -@erase "$(INTDIR)\gregor.obj"
+ -@erase "$(INTDIR)\jewish.obj"
+ -@erase "$(INTDIR)\julian.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(OUTDIR)\php3_calendar.dll"
+ -@erase "$(OUTDIR)\php3_calendar.exp"
+ -@erase "$(OUTDIR)\php3_calendar.lib"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MT /W3 /GX /O2 /I "./" /I "../" /D "NDEBUG" /D "COMPILE_DL" /D "MSVC5" /D "WIN32" /D "_WINDOWS" /Fp"$(INTDIR)\calendar.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\calendar.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=php.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /version:1 /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\php3_calendar.pdb" /machine:I386 /out:"$(OUTDIR)\php3_calendar.dll" /implib:"$(OUTDIR)\php3_calendar.lib" /libpath:"cgi_release"
+LINK32_OBJS= \
+ "$(INTDIR)\calendar.obj" \
+ "$(INTDIR)\dow.obj" \
+ "$(INTDIR)\french.obj" \
+ "$(INTDIR)\gregor.obj" \
+ "$(INTDIR)\jewish.obj" \
+ "$(INTDIR)\julian.obj"
+
+"$(OUTDIR)\php3_calendar.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "calendar - Win32 Debug"
+
+OUTDIR=.\module_debug
+INTDIR=.\module_debug
+# Begin Custom Macros
+OutDir=.\module_debug
+# End Custom Macros
+
+ALL : "$(OUTDIR)\php3_calendar.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\calendar.obj"
+ -@erase "$(INTDIR)\dow.obj"
+ -@erase "$(INTDIR)\french.obj"
+ -@erase "$(INTDIR)\gregor.obj"
+ -@erase "$(INTDIR)\jewish.obj"
+ -@erase "$(INTDIR)\julian.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(OUTDIR)\php3_calendar.dll"
+ -@erase "$(OUTDIR)\php3_calendar.exp"
+ -@erase "$(OUTDIR)\php3_calendar.ilk"
+ -@erase "$(OUTDIR)\php3_calendar.lib"
+ -@erase "$(OUTDIR)\php3_calendar.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MTd /W3 /Gm /GX /ZI /Od /I "./" /I "../" /D "DEBUG" /D "_DEBUG" /D "COMPILE_DL" /D "MSVC5" /D "WIN32" /D "_WINDOWS" /Fp"$(INTDIR)\calendar.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\calendar.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=php.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /version:1 /subsystem:windows /dll /incremental:yes /pdb:"$(OUTDIR)\php3_calendar.pdb" /debug /machine:I386 /out:"$(OUTDIR)\php3_calendar.dll" /implib:"$(OUTDIR)\php3_calendar.lib" /pdbtype:sept /libpath:"cgi_debug"
+LINK32_OBJS= \
+ "$(INTDIR)\calendar.obj" \
+ "$(INTDIR)\dow.obj" \
+ "$(INTDIR)\french.obj" \
+ "$(INTDIR)\gregor.obj" \
+ "$(INTDIR)\jewish.obj" \
+ "$(INTDIR)\julian.obj"
+
+"$(OUTDIR)\php3_calendar.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF
+
+
+!IF "$(NO_EXTERNAL_DEPS)" != "1"
+!IF EXISTS("calendar.dep")
+!INCLUDE "calendar.dep"
+!ELSE
+!MESSAGE Warning: cannot find "calendar.dep"
+!ENDIF
+!ENDIF
+
+
+!IF "$(CFG)" == "calendar - Win32 Release" || "$(CFG)" == "calendar - Win32 Debug"
+SOURCE=.\dl\calendar\calendar.c
+
+"$(INTDIR)\calendar.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\dl\calendar\dow.c
+
+"$(INTDIR)\dow.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\dl\calendar\french.c
+
+"$(INTDIR)\french.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\dl\calendar\gregor.c
+
+"$(INTDIR)\gregor.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\dl\calendar\jewish.c
+
+"$(INTDIR)\jewish.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\dl\calendar\julian.c
+
+"$(INTDIR)\julian.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+
+!ENDIF
+
diff --git a/config.guess b/config.guess
new file mode 100644
index 0000000..b3dffc8
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,743 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ alpha:OSF1:*:*)
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'`
+ exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit 0 ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-cbm-sysv4
+ exit 0;;
+ amiga:NetBSD:*:*)
+ echo m68k-cbm-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ amiga:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arc64:OpenBSD:*:*)
+ echo mips64el-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hkmips:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ pmax:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sgi:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ wgrisc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit 0;;
+ SR2?01:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit 0;;
+ Pyramid*:OSx*:*:*|MIS*:OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit 0 ;;
+ NILE:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit 0 ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit 0 ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:NetBSD:*:*)
+ echo m68k-atari-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:NetBSD:*:*)
+ echo m68k-sun-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:NetBSD:*:*)
+ echo m68k-apple-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit 0 ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ 2020:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit 0 ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ sed 's/^ //' << EOF >dummy.c
+ int main (argc, argv) int argc; char **argv; {
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy \
+ && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit 0 ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit 0 ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit 0 ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit 0 ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+ -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit 0 ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit 0 ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit 0 ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i?86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ sed 's/^ //' << EOF >dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo rs6000-ibm-aix3.2.5
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit 0 ;;
+ *:AIX:*:4)
+ if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=4.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit 0 ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit 0 ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit 0 ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit 0 ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit 0 ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit 0 ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit 0 ;;
+ 9000/[3478]??:HP-UX:*:*)
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;;
+ 9000/8?? ) HP_ARCH=hppa1.0 ;;
+ esac
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ 3050*:HI-UX:*:*)
+ sed 's/^ //' << EOF >dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo unknown-hitachi-hiuxwe2
+ exit 0 ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit 0 ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit 0 ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit 0 ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit 0 ;;
+ i?86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit 0 ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit 0 ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ CRAY*X-MP:*:*:*)
+ echo xmp-cray-unicos
+ exit 0 ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+ exit 0 ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY-2:*:*:*)
+ echo cray2-cray-unicos
+ exit 0 ;;
+ F300:UNIX_System_V:*:*)
+ FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ F301:UNIX_System_V:*:*)
+ echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+ exit 0 ;;
+ hp3[0-9][05]:NetBSD:*:*)
+ echo m68k-hp-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hp300:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:BSD/386:*:* | *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:FreeBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+ *:NetBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ i*:CYGWIN*:*)
+ echo i386-pc-cygwin32
+ exit 0 ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin32
+ exit 0 ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ *:GNU:*:*)
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ *:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us.
+ ld_help_string=`ld --help 2>&1`
+ if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i.86"; then
+ echo "${UNAME_MACHINE}-pc-linux-gnu" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86linux"; then
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86coff"; then
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then
+ echo "${UNAME_MACHINE}-unknown-linux-gnu" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then
+ echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32ppc"; then
+ echo "powerpc-unknown-linux-gnu" ; exit 0
+ elif test "${UNAME_MACHINE}" = "alpha" ; then
+ echo alpha-unknown-linux-gnu ; exit 0
+ elif test "${UNAME_MACHINE}" = "sparc" ; then
+ echo sparc-unknown-linux-gnu ; exit 0
+ elif test "${UNAME_MACHINE}" = "mips" ; then
+ cat >dummy.c <<EOF
+main(argc, argv)
+int argc;
+char *argv[];
+{
+#ifdef __MIPSEB__
+ printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+ printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ else
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or one that does not give us
+ # useful --help. Gcc wants to distinguish between linux-gnuoldld and linux-gnuaout.
+ test ! -d /usr/lib/ldscripts/. \
+ && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+ # Determine whether the default compiler is a.out or elf
+ cat >dummy.c <<EOF
+main(argc, argv)
+int argc;
+char *argv[];
+{
+#ifdef __ELF__
+ printf ("%s-pc-linux-gnu\n", argv[1]);
+#else
+ printf ("%s-pc-linux-gnuaout\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+ i?86:DYNIX/ptx:4*:*)
+ echo i386-sequent-sysv4
+ exit 0 ;;
+ i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ i?86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit 0 ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit 0 ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit 0 ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit 0 ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit 0 ;;
+ M68*:*:R3V[567]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+ m68*:LynxOS:2.*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit 0 ;;
+ i?86:LynxOS:2.*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit 0 ;;
+ BS2000:POSIX-BC:*:*) # EBCDIC based mainframe with POSIX subsystem
+ echo bs2000-siemens-sysv4
+ exit 0 ;;
+ PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit 0 ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit 0 ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit 0 ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit 0 ;;
+ R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+ printf ("vax-dec-bsd\n"); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
+rm -f dummy.c dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ c34*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ c38*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ c4*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..7f45fed
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,489 @@
+/* config.h.in. Generated automatically from configure.in by autoheader. */
+
+/* Define if using alloca.c. */
+#undef C_ALLOCA
+
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+ This function is required for alloca.c support on those systems. */
+#undef CRAY_STACKSEG_END
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef gid_t
+
+/* Define if you have alloca, as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
+#undef HAVE_ALLOCA_H
+
+/* Define if you don't have vprintf but do have _doprnt. */
+#undef HAVE_DOPRNT
+
+/* Define if your struct stat has st_blksize. */
+#undef HAVE_ST_BLKSIZE
+
+/* Define if your struct stat has st_blocks. */
+#undef HAVE_ST_BLOCKS
+
+/* Define if your struct stat has st_rdev. */
+#undef HAVE_ST_RDEV
+
+/* Define if your struct tm has tm_zone. */
+#undef HAVE_TM_ZONE
+
+/* Define if you don't have tm_zone but do have the external array
+ tzname. */
+#undef HAVE_TZNAME
+
+/* Define if utime(file, NULL) sets file's timestamp to the present. */
+#undef HAVE_UTIME_NULL
+
+/* Define if you have the vprintf function. */
+#undef HAVE_VPRINTF
+
+/* Define if your C compiler doesn't accept -c and -o together. */
+#undef NO_MINUS_C_MINUS_O
+
+/* Define to `unsigned' if <sys/types.h> doesn't define. */
+#undef size_t
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at run-time.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown
+ */
+#undef STACK_DIRECTION
+
+/* Define if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define if your <sys/time.h> declares struct tm. */
+#undef TM_IN_SYS_TIME
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef uid_t
+
+/* This is the default configuration file to read */
+#define CONFIGURATION_FILE_PATH "php3.ini"
+#define USE_CONFIG_FILE 1
+
+/* Some global constants defined by conigure */
+#undef PHP_BUILD_DATE
+#undef PHP_OS
+#undef PHP_UNAME
+
+/* define uint by configure if it is missed (QNX and BSD derived) */
+#undef uint
+
+/* define ulong by configure if it is missed (most probably is) */
+#undef ulong
+
+/* type check for in_addr_t */
+#undef in_addr_t
+
+/* crypt capability checks */
+#undef PHP3_STD_DES_CRYPT
+#undef PHP3_EXT_DES_CRYPT
+#undef PHP3_MD5_CRYPT
+#undef PHP3_BLOWFISH_CRYPT
+
+/* Define if you have the resolv library (-lresolv). */
+#define HAVE_LIBRESOLV 0
+
+/* Define if you have the gd library (-lgd). */
+#define HAVE_LIBGD 0
+
+/* Define if you have the zlib library */
+#define HAVE_ZLIB 0
+
+/* Define if you have the gd version 1.3 library (-lgd). */
+#define HAVE_LIBGD13 0
+
+/* Define if you want safe mode enabled by default. */
+#define PHP_SAFE_MODE 0
+
+/* Set to the path to the dir containing safe mode executables */
+#define PHP_SAFE_MODE_EXEC_DIR /usr/local/php/bin
+
+/* Define if you want POST/GET/Cookie track variables by default */
+#define PHP_TRACK_VARS 0
+
+/* Undefine if you want stricter XML/SGML compliance by default */
+/* (this disables "<?expression?>" by default) */
+#define DEFAULT_SHORT_OPEN_TAG 1
+
+/* Undefine if you do not want PHP by default to escape "'" */
+/* in GET/POST/Cookie data */
+#define MAGIC_QUOTES 1
+
+/* Define if you an ndbm compatible library (-ldbm). */
+#define NDBM 0
+
+/* Define if you have the gdbm library (-lgdbm). */
+#define GDBM 0
+
+/* Define both of these if you want the bundled REGEX library */
+#define REGEX 0
+#define HSREGEX 0
+
+/* Define if you want Solid database support */
+#define HAVE_SOLID 0
+
+/* Define if you want to use the supplied dbase library */
+#define DBASE 0
+
+/* Define if you want Hyperwave support */
+#define HYPERWAVE 0
+
+/* Define if you have the Oracle database client libraries */
+#define HAVE_ORACLE 0
+
+/* Define if you have the Oracle version 8 database client libraries */
+#define HAVE_OCI8 0
+
+/* Define if you want to use the iODBC database driver */
+#define HAVE_IODBC 0
+
+/* Define if you want to use the OpenLink ODBC database driver */
+#define HAVE_OPENLINK 0
+
+/* Define if you have the AdabasD client libraries */
+#define HAVE_ADABAS 0
+
+/* Define if you want the LDAP directory interface */
+#define HAVE_LDAP 0
+
+/* Define if you want the SNMP interface */
+#define HAVE_SNMP 0
+
+/* Define if you want the IMAP directory interface */
+#define HAVE_IMAP 0
+
+/* Define if you want to use a custom ODBC database driver */
+#define HAVE_CODBC 0
+
+/* Define to use the unified ODBC interface */
+#define HAVE_UODBC 0
+
+/* Define if you have libdl (used for dynamic linking) */
+#define HAVE_LIBDL 0
+
+/* Define if you have libdnet_stub (used for Sybase support) */
+#define HAVE_LIBDNET_STUB 0
+
+/* Define if you have and want to use libcrypt */
+#define HAVE_LIBCRYPT 0
+
+/* Define if you have and want to use libnsl */
+#define HAVE_LIBNSL 0
+
+/* Define if you have and want to use libsocket */
+#define HAVE_LIBSOCKET 0
+
+/* Define if you have the sendmail program available */
+#define HAVE_SENDMAIL 0
+
+/* Define if you are compiling PHP as an Apache module */
+#define APACHE 0
+
+/* Define if you are compiling PHP as an Apache module with mod_charset patch applied (aka Russian Apache)*/
+#define USE_TRANSFER_TABLES 0
+
+/* Define if you are compiling PHP as an fhttpd module */
+#define FHTTPD 0
+
+/* Define if your Apache creates an ap_config.h header file (only 1.3b6 and later) */
+#define HAVE_AP_CONFIG_H 0
+
+/* Define if your Apache has src/include/compat.h */
+#define HAVE_OLD_COMPAT_H 0
+
+/* Define if your Apache has src/include/ap_compat.h */
+#define HAVE_AP_COMPAT_H 0
+
+#ifndef HAVE_EMPRESS
+#define HAVE_EMPRESS 0
+#endif
+
+#define HAVE_SYBASE 0
+#define HAVE_SYBASE_CT 0
+
+#ifndef HAVE_MYSQL
+#define HAVE_MYSQL 0
+#endif
+
+#ifndef HAVE_MSQL
+#define HAVE_MSQL 0
+#endif
+
+#ifndef HAVE_PGSQL
+#define HAVE_PGSQL 0
+#endif
+
+#ifndef HAVE_VELOCIS
+#define HAVE_VELOCIS 0
+#endif
+
+#ifndef HAVE_IFX
+#define HAVE_IFX 0
+#endif
+#ifndef HAVE_IFX_IUS
+#define HAVE_IFX_IUS 0
+#endif
+#ifndef IFX_VERSION
+#define IFX_VERSION 0
+#endif
+
+#ifndef HAVE_IBASE
+#define HAVE_IBASE 0
+#endif
+
+#ifndef HAVE_PQCMDTUPLES
+#define HAVE_PQCMDTUPLES 0
+#endif
+
+#define MSQL1 0
+#define HAVE_FILEPRO 0
+#define HAVE_SOLID 0
+#define DEBUG 0
+
+/* Define if you want to enable bc style precision math support */
+#define WITH_BCMATH 0
+
+/* Define if you want to prevent the CGI from working unless REDIRECT_STATUS is defined in the environment */
+#define FORCE_CGI_REDIRECT 0
+
+/* Define if you want to prevent the CGI from using path_info and path_translated */
+#define DISCARD_PATH 0
+
+/* Define if you want to enable memory limit support */
+#define MEMORY_LIMIT 0
+
+/* Define if you want include() and other functions to be able to open
+ * http and ftp URLs as files.
+ */
+#define PHP3_URL_FOPEN 0
+
+/* Define if you want System V semaphore support.
+ */
+#define HAVE_SYSVSEM 0
+
+/* Define if you have union semun.
+ */
+#define HAVE_SEMUN 0
+
+/* Define if you want System V shared memory support.
+ */
+#define HAVE_SYSVSHM 0
+
+/* Define if you have broken header files like SunOS 4 */
+#define MISSING_FCLOSE_DECL 0
+
+/* Define if you have broken sprintf function like SunOS 4 */
+#define BROKEN_SPRINTF 0
+
+/* Define if you have the expat (XML Parser Toolkit) library */
+#define HAVE_LIBEXPAT 0
+
+/* Define if you have the pdflib library */
+#define HAVE_PDFLIB 0
+
+/* Define if you have the fdftk library */
+#define HAVE_FDFLIB 0
+
+/* Define to compile with mod_dav support */
+#define HAVE_MOD_DAV 0
+
+/* Define if you have the crypt function. */
+#undef HAVE_CRYPT
+
+/* Define if you have the cuserid function. */
+#undef HAVE_CUSERID
+
+/* Define if you have the flock function. */
+#undef HAVE_FLOCK
+
+/* Define if you have the gcvt function. */
+#undef HAVE_GCVT
+
+/* Define if you have the getlogin function. */
+#undef HAVE_GETLOGIN
+
+/* Define if you have the getopt function. */
+#undef HAVE_GETOPT
+
+/* Define if you have the gettimeofday function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define if you have the link function. */
+#undef HAVE_LINK
+
+/* Define if you have the lockf function. */
+#undef HAVE_LOCKF
+
+/* Define if you have the lrand48 function. */
+#undef HAVE_LRAND48
+
+/* Define if you have the memcpy function. */
+#undef HAVE_MEMCPY
+
+/* Define if you have the memmove function. */
+#undef HAVE_MEMMOVE
+
+/* Define if you have the putenv function. */
+#undef HAVE_PUTENV
+
+/* Define if you have the random function. */
+#undef HAVE_RANDOM
+
+/* Define if you have the regcomp function. */
+#undef HAVE_REGCOMP
+
+/* Define if you have the rint function. */
+#undef HAVE_RINT
+
+/* Define if you have the setlocale function. */
+#undef HAVE_SETLOCALE
+
+/* Define if you have the setsockopt function. */
+#undef HAVE_SETSOCKOPT
+
+/* Define if you have the setvbuf function. */
+#undef HAVE_SETVBUF
+
+/* Define if you have the snprintf function. */
+#undef HAVE_SNPRINTF
+
+/* Define if you have the srand48 function. */
+#undef HAVE_SRAND48
+
+/* Define if you have the srandom function. */
+#undef HAVE_SRANDOM
+
+/* Define if you have the strcasecmp function. */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strdup function. */
+#undef HAVE_STRDUP
+
+/* Define if you have the strerror function. */
+#undef HAVE_STRERROR
+
+/* Define if you have the strftime function. */
+#undef HAVE_STRFTIME
+
+/* Define if you have the strstr function. */
+#undef HAVE_STRSTR
+
+/* Define if you have the symlink function. */
+#undef HAVE_SYMLINK
+
+/* Define if you have the tempnam function. */
+#undef HAVE_TEMPNAM
+
+/* Define if you have the tzset function. */
+#undef HAVE_TZSET
+
+/* Define if you have the unsetenv function. */
+#undef HAVE_UNSETENV
+
+/* Define if you have the usleep function. */
+#undef HAVE_USLEEP
+
+/* Define if you have the utime function. */
+#undef HAVE_UTIME
+
+/* Define if you have the vsnprintf function. */
+#undef HAVE_VSNPRINTF
+
+/* Define if you have the <crypt.h> header file. */
+#undef HAVE_CRYPT_H
+
+/* Define if you have the <dirent.h> header file. */
+#undef HAVE_DIRENT_H
+
+/* Define if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define if you have the <errmsg.h> header file. */
+#undef HAVE_ERRMSG_H
+
+/* Define if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <grp.h> header file. */
+#undef HAVE_GRP_H
+
+/* Define if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define if you have the <mysql.h> header file. */
+#undef HAVE_MYSQL_H
+
+/* Define if you have the <ndir.h> header file. */
+#undef HAVE_NDIR_H
+
+/* Define if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Define if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define if you have the <signal.h> header file. */
+#undef HAVE_SIGNAL_H
+
+/* Define if you have the <stdarg.h> header file. */
+#undef HAVE_STDARG_H
+
+/* Define if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define if you have the <sys/dir.h> header file. */
+#undef HAVE_SYS_DIR_H
+
+/* Define if you have the <sys/file.h> header file. */
+#undef HAVE_SYS_FILE_H
+
+/* Define if you have the <sys/ndir.h> header file. */
+#undef HAVE_SYS_NDIR_H
+
+/* Define if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define if you have the <sys/varargs.h> header file. */
+#undef HAVE_SYS_VARARGS_H
+
+/* Define if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define if you have the <syslog.h> header file. */
+#undef HAVE_SYSLOG_H
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <unix.h> header file. */
+#undef HAVE_UNIX_H
+
+/* Define if you have the gd library (-lgd). */
+#undef HAVE_LIBGD
+
+/* Define if you have the m library (-lm). */
+#undef HAVE_LIBM
+
+/* Define if you have the resolv library (-lresolv). */
+#undef HAVE_LIBRESOLV
+
+/* Define if you have the ttf library (-lttf). */
+#undef HAVE_LIBTTF
diff --git a/config.sub b/config.sub
new file mode 100644
index 0000000..0131946
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,939 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+# Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+ echo Configuration name missing. 1>&2
+ echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+ echo "or $0 ALIAS" 1>&2
+ echo where ALIAS is a recognized configuration type. 1>&2
+ exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+ *local*)
+ echo $1
+ exit 0
+ ;;
+ *)
+ ;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ linux-gnu*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple)
+ os=
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arm \
+ | arme[lb] | pyramid | mn10300 \
+ | tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \
+ | alpha | we32k | ns16k | clipper | i370 | sh \
+ | powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \
+ | pdp11 | mips64el | mips64orion | mips64orionel \
+ | sparc | sparclet | sparclite | sparc64)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i[3456]86)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ vax-* | tahoe-* | i[3456]86-* | i860-* | m32r-* | m68k-* | m68000-* \
+ | m88k-* | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
+ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
+ | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
+ | hppa-* | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
+ | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
+ | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \
+ | mips64el-* | mips64orion-* | mips64orionel-* | f301-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-cbm
+ ;;
+ amigados)
+ basic_machine=m68k-cbm
+ os=-amigados
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-cbm
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ cray2)
+ basic_machine=cray2-cray
+ os=-unicos
+ ;;
+ [ctj]90-cray)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i[3456]86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i[3456]86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i[3456]86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i[3456]86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ mipsel*-linux*)
+ basic_machine=mipsel-unknown
+ os=-linux
+ ;;
+ mips*-linux*)
+ basic_machine=mips-unknown
+ os=-linux
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5)
+ basic_machine=i586-intel
+ ;;
+ pentiumpro | p6)
+ basic_machine=i686-intel
+ ;;
+ pentium-* | p5-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ k5)
+ # We don't have specific support for AMD's K5 yet, so just call it a Pentium
+ basic_machine=i586-amd
+ ;;
+ nexen)
+ # We don't have specific support for Nexgen yet, so just call it a Pentium
+ basic_machine=i586-nexgen
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=rs6000-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ xmp)
+ basic_machine=xmp-cray
+ os=-unicos
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ mips)
+ if [ x$os = x-linux ]; then
+ basic_machine=mips-unknown
+ else
+ basic_machine=mips-mips
+ fi
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sparc)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -unixware* | svr4*)
+ os=-sysv4
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -linux-gnu* | -uxpv*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigados
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f301-fujitsu)
+ os=-uxpv
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -vxsim* | -vxworks*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..6a340f6
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,1965 @@
+dnl $Id$
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(main.c)
+
+PHP_VERSION=`cut -d\" -f 2 $srcdir/php_version.h`
+AC_SUBST(PHP_VERSION)
+
+AC_CONFIG_HEADER(config.h)
+AM_SANITY_CHECK
+AM_MAINTAINER_MODE
+
+dnl We want this one before the checks, so the checks can modify CFLAGS.
+test -z "$CFLAGS" && auto_cflags=1
+
+dnl Checks for programs.
+AC_PROG_YACC
+if test "$YACC" != "bison -y"; then
+ AC_MSG_WARN(You will need bison if you'd want to regenerate the PHP 3.0 parsers.)
+else
+ AC_MSG_CHECKING(bison version)
+ set `bison --version| sed -e 's/^GNU Bison version //' -e 's/\./ /'`
+ if test "$1" = "1" -a "$2" -lt "25"; then
+ AC_MSG_WARN(You will need bison 1.25 if you'd want to regenerate the PHP 3.0 parsers (found $1.$2).)
+ fi
+ AC_MSG_RESULT($1.$2 (ok))
+fi
+AC_PROG_CC
+AC_PROG_RANLIB
+AC_PROG_CC_C_O
+AC_PATH_PROG(PERL_PATH, perl)
+
+dnl Ugly hack to get around a problem with gcc on AIX.
+if test "$CC" = "gcc" -a "$ac_cv_prog_cc_g" = "yes" -a \
+ "`uname -sv`" = "AIX 4"; then
+ CFLAGS=`echo $CFLAGS | sed -e 's/-g//'`
+fi
+
+dnl check for -R, etc. switch
+AC_MSG_CHECKING(if compiler supports -R)
+AC_CACHE_VAL(php_cv_cc_dashr,[
+ SAVE_LIBS="${LIBS}"
+ LIBS="-R /usr/lib ${LIBS}"
+ AC_TRY_LINK([], [], php_cv_cc_dashr=yes, php_cv_cc_dashr=no)
+ LIBS="${SAVE_LIBS}"])
+AC_MSG_RESULT($php_cv_cc_dashr)
+if test $php_cv_cc_dashr = "yes"; then
+ ld_runpath_switch="-R"
+ apxs_runpath_switch="-Wl,-R"
+else
+ AC_MSG_CHECKING([if compiler supports -Wl,-rpath,])
+ AC_CACHE_VAL(php_cv_cc_rpath,[
+ SAVE_LIBS="${LIBS}"
+ LIBS="-Wl,-rpath,/usr/lib ${LIBS}"
+ AC_TRY_LINK([], [], php_cv_cc_rpath=yes, php_cv_cc_rpath=no)
+ LIBS="${SAVE_LIBS}"])
+ AC_MSG_RESULT($php_cv_cc_rpath)
+ if test $php_cv_cc_rpath = "yes"; then
+ ld_runpath_switch="-Wl,-rpath,"
+ apxs_runpath_switch="-Wl,-rpath "
+ else
+ dnl something innocuous
+ ld_runpath_switch="-L"
+ apxs_runpath_switch="-L"
+ fi
+fi
+
+
+dnl Check compiler support for -rdynamic
+AC_MSG_CHECKING(if compiler supports -rdynamic)
+AC_CACHE_VAL(php_cc_rdynamic,[
+ SAVE_LIBS="${LIBS}"
+ LIBS="-rdynamic ${LIBS}"
+ AC_TRY_LINK([], [], php_cc_rdynamic=yes, php_cc_rdynamic=no)
+ LIBS="${SAVE_LIBS}"])
+AC_MSG_RESULT($php_cc_rdynamic)
+if test $php_cc_rdynamic = "yes"; then
+ LDFLAGS="${LDFLAGS} -rdynamic"
+ RDYNAMIC_LFLAGS="-rdynamic"
+else
+ RDYNAMIC_LFLAGS=""
+fi
+AC_SUBST(RDYNAMIC_LFLAGS)
+
+
+dnl AC_PROG_INSTALL
+AC_PATH_PROG(PROG_SENDMAIL, sendmail, /usr/lib/sendmail, $PATH /usr/bin /usr/sbin /usr/etc /etc /usr/ucblib)
+if test -n "$PROG_SENDMAIL"; then
+ AC_DEFINE(HAVE_SENDMAIL)
+fi
+
+dnl
+dnl Check for /usr/pkg/{lib,include} which is where NetBSD puts binary
+dnl and source packages. This should be harmless on other OSs.
+dnl
+if test -d /usr/pkg/include -a -d /usr/pkg/lib ; then
+ CFLAGS="$CFLAGS -I/usr/pkg/include"
+ LDFLAGS="$LDFLAGS -L/usr/pkg/lib"
+fi
+
+AC_PREFERRED_DB_LIB
+
+AC_CHECK_LIB(nsl, gethostname, [
+ LIBS="-lnsl $LIBS"
+ AC_DEFINE(HAVE_LIBNSL) ], [])
+
+AC_CHECK_LIB(c, socket, [:], [
+ AC_CHECK_LIB(socket, socket, [
+ LIBS="-lsocket $LIBS"
+ AC_DEFINE(HAVE_LIBSOCKET) ], []) ])
+
+AC_CHECK_LIB(c, gethostbyaddr, [:], [
+ AC_CHECK_LIB(nsl, gethostbyaddr, [
+ LIBS="-lnsl $LIBS"
+ AC_DEFINE(HAVE_LIBNSL) ], []) ])
+
+AC_CHECK_LIB(c, crypt, [:], [
+ AC_CHECK_LIB(crypt, crypt, [
+ LIBS="-lcrypt $LIBS"
+ AC_DEFINE(HAVE_LIBCRYPT) ], []) ])
+
+AC_CHECK_LIB(c, dlopen, [
+ # fake it
+ AC_DEFINE(HAVE_LIBDL) ], [
+ AC_CHECK_LIB(dl, dlopen, [
+ LIBS="-ldl $LIBS"
+ AC_DEFINE(HAVE_LIBDL) ], []) ])
+
+dnl The sin may be in a library which need not be specifed
+dnl as well as res_search resides in libsocket
+AC_CHECK_LIB(c, sin, [:], [
+ AC_CHECK_LIB(m, sin) ])
+
+dnl The res_search may be in libsocket as well, and if it is
+dnl make sure to check for dn_skipname in libresolv, or if res_search
+dnl is in neither of these libs, still check for dn_skipname in libresolv
+AC_CHECK_LIB(socket, res_search, [
+ AC_CHECK_LIB(resolv, dn_skipname)
+ LIBS="$LIBS -lsocket"
+ AC_DEFINE(HAVE_LIBSOCKET) ], [
+ AC_CHECK_LIB(resolv, res_search, [
+ LIBS="$LIBS -lresolv"
+ AC_DEFINE(HAVE_LIBRESOLV)
+ ], [
+ AC_CHECK_LIB(resolv, dn_skipname)
+ ])
+])
+
+dnl Checks for header files.
+AC_HEADER_STDC
+
+dnl In QNX opendir resides in libc but dirent.h is still required
+if test "`uname -s 2>/dev/null`" != "QNX"; then
+ AC_HEADER_DIRENT
+else
+ AC_CHECK_HEADERS(dirent.h)
+fi
+AC_MISSING_FCLOSE_DECL
+dnl QNX requires unix.h to allow functions in libunix to work properly
+AC_CHECK_HEADERS(fcntl.h unistd.h crypt.h sys/file.h memory.h pwd.h grp.h sys/socket.h sys/wait.h syslog.h string.h sys/varargs.h stdarg.h sys/time.h signal.h netinet/in.h dlfcn.h limits.h sys/types.h unix.h)
+if test "$DBM_LIB" = "-lgdbm"; then
+ AC_CHECK_HEADER(gdbm.h, [ GDBM_INCLUDE="" ], [
+ AC_MSG_RESULT("Try /usr/local/include/gdbm.h");
+ AC_CHECK_HEADER(/usr/local/include/gdbm.h, [ GDBM_INCLUDE="-I/usr/local/include" ],[
+ AC_MSG_RESULT("Try /opt/local/include/gdbm.h");
+ AC_CHECK_HEADER(/opt/local/include/gdbm.h, [ GDBM_INCLUDE="-I/opt/local/include" ],[
+ dnl if in /usr/pkg/include, don't add anything. See above.
+ AC_MSG_RESULT("Try /usr/pkg/include/gdbm.h");
+ AC_CHECK_HEADER(/usr/pkg/include/gdbm.h, [ GDBM_INCLUDE="" ],[
+ AC_MSG_RESULT("Giving up - You need to install gdbm.h somewhere");
+ exit
+ ])
+ ])
+ ])
+ ])
+ AC_SUBST(GDBM_INCLUDE)
+fi
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_STRUCT_TM
+AC_STRUCT_TIMEZONE
+
+dnl Check for members of the stat structure
+AC_STRUCT_ST_BLKSIZE
+dnl AC_STRUCT_ST_BLOCKS will screw QNX because fileblocks.o does not exists
+dnl The WARNING_LEVEL required because cc in QNX hates -w option without an argument
+if test "`uname -s 2>/dev/null`" != "QNX"; then
+ AC_STRUCT_ST_BLOCKS
+else
+ AC_MSG_WARN(warnings level for cc set to 0)
+ WARNING_LEVEL=0
+ AC_SUBST(WARNING_LEVEL)
+fi
+AC_STRUCT_ST_RDEV
+
+dnl Checks for types
+AC_TYPE_SIZE_T
+AC_TYPE_UID_T
+dnl This is required for QNX and may be some BSD derived systems
+AC_CHECK_TYPE( uint, unsigned int )
+AC_CHECK_TYPE( ulong, unsigned long )
+
+dnl Checks for library functions.
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS(memcpy memmove strdup strerror strcasecmp strstr flock lockf putenv tempnam usleep setlocale gettimeofday setvbuf srand48 lrand48 srandom random link symlink regcomp getlogin cuserid vsnprintf snprintf gcvt utime crypt rint unsetenv strftime setsockopt tzset)
+AC_FUNC_UTIME_NULL
+AC_FUNC_ALLOCA
+AC_BROKEN_SPRINTF
+AC_REPLACE_FUNCS(getopt)
+
+dnl AIX keeps in_addr_t in /usr/include/netinet/in.h
+dnl AC_MSG_CHECKING(for in_addr_t)
+AC_CACHE_VAL(ac_cv_type_$1,
+[AC_EGREP_CPP(dnl
+changequote(<<,>>)dnl
+<<in_addr_t[^a-zA-Z_0-9]>>dnl
+changequote([,]), [#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif], ac_cv_type_in_addr_t=yes, ac_cv_type_in_addr_t=no)])dnl
+
+dnl AC_MSG_RESULT($ac_cv_type_in_addr_t)
+if test $ac_cv_type_in_addr_t = no; then
+ AC_DEFINE(in_addr_t, u_int)
+fi
+
+AC_CRYPT_CAP
+
+AC_MSG_CHECKING(whether to use bundled regex library)
+AC_ARG_WITH(system-regex,
+[ --with-system-regex Do not use the bundled regex library],
+[
+ REGEX_LIB=
+ HSREGEX=no
+ AC_MSG_RESULT(no)
+ AC_DEFINE(REGEX,0)
+],[
+ REGEX_LIB=regex/libregex.a
+ HSREGEX=yes
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HSREGEX)
+ AC_DEFINE(REGEX,1)
+])
+AC_SUBST(REGEX_LIB)
+AC_SUBST(HSREGEX)
+
+AC_MSG_CHECKING(for Apache module support via DSO through APXS)
+AC_ARG_WITH(apxs,
+[ --with-apxs[=FILE] Build shared Apache module. FILE is the optional
+ pathname to the Apache apxs tool; defaults to "apxs".
+ (This option needs Perl installed)],
+[
+ if test "$withval" = "yes"; then
+ withval=apxs
+ fi
+ APXS="$withval"
+ APXS_LDFLAGS="@DBASE_LIB@ @ORACLE_LFLAGS@ @ORACLE_LIBS@ @IODBC_LFLAGS@ @IODBC_LIBS@ @SYBASE_LFLAGS@ @SYBASE_LIBS@ @SYBASE_CT_LFLAGS@ @SYBASE_CT_LIBS@ @MYSQL_LFLAGS@ @MYSQL_LIBS@ @MSQL_LFLAGS@ @MSQL_LIBS@ @ADA_LFLAGS@ @ADA_LIBS@ @SOLID_LIBS@ @EMPRESS_LIBS@ @OPENLINK_LIBS@ @PGSQL_LFLAGS@ @PGSQL_LIBS@ @LDAP_LFLAGS@ @LDAP_LIBS@ @VELOCIS_LIBS@ @CODBC_LFLAGS@ @CODBC_LIBS@ @ZLIB_LIBS@ @PDFLIB_LIBS@ @FDFTK_LIBS@ @IFX_LFLAGS@ @IFX_LIBS@ @IBASE_LFLAGS@ @IBASE_LIBS@"
+ APACHE_INCLUDE="-I`$APXS -q INCLUDEDIR`"
+ BINNAME=libphp3.so
+ INSTALL_IT="\$(APXS) -i -a -n php3 $BINNAME"
+ CFLAGS_SHLIB=`perl -V:cccdlflags | cut -d\' -f2`
+ LDFLAGS_SHLIB=`perl -V:lddlflags | cut -d\' -f2`
+ LDFLAGS_SHLIB_EXPORT=`perl -V:ccdlflags | cut -d\' -f2`
+ PHP_LIBS=
+ STRONGHOLD=
+ AC_DEFINE(APACHE)
+ AC_SUBST(APXS)
+ AC_SUBST(APXS_LDFLAGS)
+ AC_SUBST(BINNAME)
+ AC_SUBST(INSTALL_IT)
+ AC_SUBST(PHP_LIBS)
+ AC_DEFINE(HAVE_AP_CONFIG_H)
+ AC_DEFINE(HAVE_AP_COMPAT_H)
+ AC_MSG_RESULT(yes)
+],[
+ AC_MSG_RESULT(no)
+])
+
+
+APACHE_INSTALL_FILES="$srcdir/mod_php3.* $srcdir/php_version.h libphp3.module $srcdir/libzend/libzend.a"
+
+
+AC_MSG_CHECKING(for Apache module support via DSO through APACI)
+AC_ARG_WITH(shared-apache,
+[ --with-shared-apache[=DIR] Build shared Apache module. DIR is the top-level
+ Apache build directory, defaults to /usr/local/etc/httpd.
+ (This option needs Perl installed)],
+[
+ if test "$withval" = "yes"; then
+ # Apache's default directory
+ withval=/usr/local/etc/httpd
+ fi
+ if test "$withval" != "no"; then
+ if test -f $withval/src/include/httpd.h; then
+ APACHE_INCLUDE="-I$withval/src/include -I$withval/src/os/unix"
+ APACHE_TARGET=$withval/src/modules/php3
+ if test ! -d $APACHE_TARGET; then
+ mkdir $APACHE_TARGET
+ fi
+ CFLAGS_SHLIB=`perl -V:cccdlflags | cut -d\' -f2`
+ LDFLAGS_SHLIB=`perl -V:lddlflags | cut -d\' -f2`
+ LDFLAGS_SHLIB_EXPORT=`perl -V:ccdlflags | cut -d\' -f2`
+ PHP_LIBS=
+ BINNAME=libmodphp3-so.a
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET; cp apMakefile.tmpl $APACHE_TARGET/Makefile.tmpl; cp apMakefile.libdir $APACHE_TARGET/Makefile.libdir"
+ AC_DEFINE(APACHE)
+ AC_MSG_RESULT(yes - Shared Apache 1.3.x)
+ STRONGHOLD=
+ if test -f $withval/src/include/ap_config.h; then
+ AC_DEFINE(HAVE_AP_CONFIG_H)
+ fi
+ if test -f $withval/src/include/ap_compat.h; then
+ AC_DEFINE(HAVE_AP_COMPAT_H)
+ if test ! -f $withval/src/include/ap_config_auto.h; then
+ AC_MSG_ERROR(Please run Apache's configure or src/Configure program once and try again)
+ fi
+ else
+ if test -f $withval/src/include/compat.h; then
+ AC_DEFINE(HAVE_OLD_COMPAT_H)
+ fi
+ fi
+ else
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR(Invalid Apache directory - unable to find httpd.h under $withval/src/include)
+ fi
+ fi
+ AC_SUBST(APACHE_INCLUDE)
+ AC_SUBST(APACHE_TARGET)
+ AC_SUBST(INSTALL_IT)
+ AC_SUBST(BINNAME)
+ AC_SUBST(PHP_LIBS)
+],[
+ AC_MSG_RESULT(no)
+])
+
+
+
+if test "$BINNAME" != "libmodphp3-so.a"; then
+if test "$BINNAME" != "libphp3.so"; then
+AC_MSG_CHECKING(for Apache module support)
+AC_ARG_WITH(apache,
+[ --with-apache[=DIR] Build Apache module. DIR is the top-level Apache
+ build directory, defaults to /usr/local/etc/httpd.],
+[
+ if test "$withval" = "yes"; then
+ # Apache's default directory
+ withval=/usr/local/etc/httpd
+ fi
+ if test "$withval" != "no"; then
+# For Apache 1.2.x
+ if test -f $withval/src/httpd.h; then
+ APACHE_INCLUDE=-I$withval/src
+ APACHE_TARGET=$withval/src
+ BINNAME=libphp3.a
+ if test "$with_dbase" = "yes"; then
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES dbase/libdbf.a $APACHE_TARGET"
+ PHP_LIBS="-L. -lphp3 -ldbf"
+ else
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET"
+ PHP_LIBS="-L. -lphp3"
+ fi
+ AC_DEFINE(APACHE)
+ AC_MSG_RESULT(yes - Apache 1.2.x)
+ STRONGHOLD=
+ if test -f $withval/src/ap_config.h; then
+ AC_DEFINE(HAVE_AP_CONFIG_H)
+ fi
+# For Apache 1.3.x
+ elif test -f $withval/src/main/httpd.h; then
+ APACHE_INCLUDE="-I$withval/src/main -I$withval/src/os/unix -I$withval/src/ap"
+ APACHE_TARGET=$withval/src/modules/php3
+ if test ! -d $APACHE_TARGET; then
+ mkdir $APACHE_TARGET
+ fi
+ BINNAME=libmodphp3.a
+ if test "$with_dbase" = "yes"; then
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES dbase/libdbf.a $APACHE_TARGET; cp $srcdir/apMakefile.tmpl $APACHE_TARGET/Makefile.tmpl; cp $srcdir/apMakefile.libdir $APACHE_TARGET/Makefile.libdir"
+ PHP_LIBS="-Lmodules/php3 -L../modules/php3 -L../../modules/php3 -lmodphp3 -ldbf"
+ else
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET; cp $srcdir/apMakefile.tmpl $APACHE_TARGET/Makefile.tmpl; cp $srcdir/apMakefile.libdir $APACHE_TARGET/Makefile.libdir"
+ PHP_LIBS="-Lmodules/php3 -L../modules/php3 -L../../modules/php3 -lmodphp3"
+ fi
+ AC_DEFINE(APACHE)
+ AC_MSG_RESULT(yes - Apache 1.3.x)
+ STRONGHOLD=
+ if test -f $withval/src/include/ap_config.h; then
+ AC_DEFINE(HAVE_AP_CONFIG_H)
+ fi
+ if test -f $withval/src/include/ap_compat.h; then
+ AC_DEFINE(HAVE_AP_COMPAT_H)
+ if test ! -f $withval/src/include/ap_config_auto.h; then
+ AC_MSG_ERROR(Please run Apache's configure or src/Configure program once and try again)
+ fi
+ else
+ if test -f $withval/src/include/compat.h; then
+ AC_DEFINE(HAVE_OLD_COMPAT_H)
+ fi
+ fi
+# Also for Apache 1.3.x
+ elif test -f $withval/src/include/httpd.h; then
+ APACHE_INCLUDE="-I$withval/src/include -I$withval/src/os/unix"
+ APACHE_TARGET=$withval/src/modules/php3
+ if test ! -d $APACHE_TARGET; then
+ mkdir $APACHE_TARGET
+ fi
+ BINNAME=libmodphp3.a
+ if test "$with_dbase" = "yes"; then
+ PHP_LIBS="-Lmodules/php3 -L../modules/php3 -L../../modules/php3 -lmodphp3 -ldbf"
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES dbase/libdbf.a $APACHE_TARGET; cp $srcdir/apMakefile.tmpl $APACHE_TARGET/Makefile.tmpl; cp $srcdir/apMakefile.libdir $APACHE_TARGET/Makefile.libdir"
+ else
+ PHP_LIBS="-Lmodules/php3 -L../modules/php3 -L../../modules/php3 -lmodphp3"
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET; cp $srcdir/apMakefile.tmpl $APACHE_TARGET/Makefile.tmpl; cp $srcdir/apMakefile.libdir $APACHE_TARGET/Makefile.libdir"
+ fi
+ AC_DEFINE(APACHE)
+ AC_MSG_RESULT(yes - Apache 1.3.x)
+ STRONGHOLD=
+ if test -f $withval/src/include/ap_config.h; then
+ AC_DEFINE(HAVE_AP_CONFIG_H)
+ fi
+ if test -f $withval/src/include/ap_compat.h; then
+ AC_DEFINE(HAVE_AP_COMPAT_H)
+ if test ! -f $withval/src/include/ap_config_auto.h; then
+ AC_MSG_ERROR(Please run Apache's configure or src/Configure program once and try again)
+ fi
+ else
+ if test -f $withval/src/include/compat.h; then
+ AC_DEFINE(HAVE_OLD_COMPAT_H)
+ fi
+ fi
+# For StrongHold 2.2
+ elif test -f $withval/apache/httpd.h; then
+ APACHE_INCLUDE=-"I$withval/apache -I$withval/ssl/include"
+ APACHE_TARGET=$withval/apache
+ BINNAME=libmodphp3.a
+ if test "$with_dbase" = "yes"; then
+ PHP_LIBS="-Lmodules/php3 -L../modules/php3 -L../../modules/php3 -lmodphp3 -ldbf"
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES dbase/libdbf.a $APACHE_TARGET"
+ else
+ PHP_LIBS="-Lmodules/php3 -L../modules/php3 -L../../modules/php3 -lmodphp3"
+ INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET"
+ fi
+ STRONGHOLD=-DSTRONGHOLD=1
+ AC_DEFINE(APACHE)
+ AC_MSG_RESULT(yes - StrongHold)
+ if test -f $withval/apache/ap_config.h; then
+ AC_DEFINE(HAVE_AP_CONFIG_H)
+ fi
+ if test -f $withval/src/ap_compat.h; then
+ AC_DEFINE(HAVE_AP_COMPAT_H)
+ if test ! -f $withval/src/include/ap_config_auto.h; then
+ AC_MSG_ERROR(Please run Apache's configure or src/Configure program once and try again)
+ fi
+ else
+ if test -f $withval/src/compat.h; then
+ AC_DEFINE(HAVE_OLD_COMPAT_H)
+ fi
+ fi
+ else
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR(Invalid Apache directory - unable to find httpd.h under $withval)
+ fi
+ else
+ AC_MSG_RESULT(no)
+ BINNAME=php
+ INSTALL_IT="cp $BINNAME \$(bindir)"
+ fi
+],[
+ AC_MSG_RESULT(no)
+ BINNAME=php
+ INSTALL_IT="cp $BINNAME \$(bindir)"
+])
+AC_SUBST(APACHE_INCLUDE)
+AC_SUBST(APACHE_TARGET)
+AC_SUBST(INSTALL_IT)
+AC_SUBST(BINNAME)
+AC_SUBST(STRONGHOLD)
+AC_SUBST(PHP_LIBS)
+fi
+fi
+
+AC_MSG_CHECKING(for mod_charset compatibility option)
+AC_ARG_WITH(mod_charset,
+[ --with-mod_charset Enable transfer tables for mod_charset (Rus Apache).],
+[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(USE_TRANSFER_TABLES)
+],[
+ AC_MSG_RESULT(no)
+])
+
+AC_MSG_CHECKING(for fhttpd module support)
+AC_ARG_WITH(fhttpd,
+[ --with-fhttpd[=DIR] Build fhttpd module. DIR is the fhttpd sources
+ directory, defaults to /usr/local/src/fhttpd.],
+[
+ if test "$withval" = "yes"; then
+ # fhttpd source directory
+ withval=/usr/local/src/fhttpd
+ fi
+ if test "$withval" != "no"; then
+# For fhttpd 0.3.x
+ if test -f $withval/servproc.h; then
+ FHTTPD_INCLUDE=-I$withval/
+ FHTTPD_LIB=$withval/servproc.o
+ FHTTPD_TARGET=$withval/
+ BINNAME=php
+ AC_DEFINE(FHTTPD)
+ AC_MSG_RESULT(yes - fhttpd 0.3.x)
+ else
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR(Invalid fhttpd directory - unable to find servproc.h under $withval)
+ fi
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(FHTTPD_INCLUDE)
+AC_SUBST(FHTTPD_LIB)
+AC_SUBST(FHTTPD_TARGET)
+
+AC_MSG_CHECKING(for IMAP support)
+AC_ARG_WITH(imap,
+[ --with-imap[=DIR] Include IMAP support (DIR is IMAP's include dir and c-client.a dir).],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ IMAP_DIR=/usr/local
+ else
+ IMAP_DIR=$withval
+ fi
+ if test ! -f $IMAP_DIR/include/mail.h; then
+ AC_MSG_ERROR(could not find mail.h in $IMAP_DIR/include !)
+ fi
+ if test ! -f $IMAP_DIR/include/rfc822.h; then
+ AC_MSG_ERROR(could not find rfc822.h in $IMAP_DIR/include !)
+ fi
+ if test ! -f $IMAP_DIR/include/linkage.h; then
+ AC_MSG_ERROR(could not find linkage.h in $IMAP_DIR/include !)
+ fi
+ if test ! -f $IMAP_DIR/lib/c-client.a; then
+ AC_MSG_ERROR(could not find c-client.a in $IMAP_DIR/lib !)
+ fi
+ IMAP_INCLUDE="-I$IMAP_DIR/include/"
+ IMAP_LIBS="$IMAP_DIR/lib/c-client.a"
+ AC_SUBST(IMAP_INCLUDE)
+ AC_SUBST(IMAP_LIBS)
+ AC_DEFINE(HAVE_IMAP)
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_ERROR(could not find imap library!)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+
+AC_MSG_CHECKING(whether to include GD support)
+AC_ARG_WITH(gd,
+[ --without-gd Disable GD support.
+ --with-gd[=DIR] Include GD support (DIR is GD's install dir).],
+[
+ case "$withval" in
+ no)
+ AC_MSG_RESULT(no) ;;
+ yes)
+ GD_LIBS="-lgd"
+ AC_DEFINE(HAVE_LIBGD)
+ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(gd, gdImageString16, [ AC_DEFINE(HAVE_LIBGD13) ])
+ ac_cv_lib_gd_gdImageLine=yes
+ ;;
+ *)
+dnl A whole whack of possible places where this might be
+ test -f $withval/include/gd1.3/gd.h && GD_INCLUDE="-I$withval/include/gd1.3"
+ test -f $withval/include/gd/gd.h && GD_INCLUDE="-I$withval/include/gd"
+ test -f $withval/include/gd.h && GD_INCLUDE="-I$withval/include"
+ test -f $withval/gd1.3/gd.h && GD_INCLUDE="-I$withval/gd1.3"
+ test -f $withval/gd/gd.h && GD_INCLUDE="-I$withval/gd"
+ test -f $withval/gd.h && GD_INCLUDE="-I$withval"
+
+ test -f $withval/lib/libgd.a && GD_LIB="$withval/lib"
+ test -f $withval/lib/gd/libgd.a && GD_LIB="$withval/lib/gd"
+ test -f $withval/lib/gd1.3/libgd.a && GD_LIB="$withval/lib/gd1.3"
+ test -f $withval/libgd.a && GD_LIB="$withval"
+ test -f $withval/gd/libgd.a && GD_LIB="$withval/gd"
+ test -f $withval/gd1.3/libgd.a && GD_LIB="$withval/gd1.3"
+
+ if test -n "$GD_INCLUDE" && test -n "$GD_LIB" ; then
+ GD_LIBS="-L$GD_LIB -lgd"
+ AC_DEFINE(HAVE_LIBGD)
+ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(gd, gdImageString16, [ AC_DEFINE(HAVE_LIBGD13) ])
+ ac_cv_lib_gd_gdImageLine=yes
+ else
+ AC_MSG_RESULT(no)
+ fi ;;
+ esac
+],[
+ AC_CHECK_LIB(gd, gdImageLine)
+ AC_CHECK_LIB(gd, gdImageString16, [ AC_DEFINE(HAVE_LIBGD13) ])
+])
+AC_SUBST(GD_LIBS)
+if test -f /usr/pkg/include/gd/gd.h -a -z "$GD_INCLUDE" ; then
+ GD_INCLUDE="-I/usr/pkg/include/gd"
+fi
+AC_SUBST(GD_INCLUDE)
+if test "$ac_cv_lib_gd_gdImageLine" = "yes"; then
+ AC_CHECK_LIB(ttf, TT_Open_Face)
+fi
+
+
+
+AC_MSG_CHECKING(for Oracle support)
+AC_ARG_WITH(oracle,
+[ --with-oracle[=DIR] Include Oracle database support. DIR is Oracle's
+ home directory, defaults to \$ORACLE_HOME.],
+[
+ case "$withval" in
+ yes)
+ ORACLEINST_TOP=$ORACLE_HOME
+ AC_MSG_RESULT(yes)
+ ;;
+ no)
+ ORACLEINST_TOP=
+ AC_MSG_RESULT(no)
+ ;;
+ *)
+ AC_MSG_RESULT(yes)
+ ORACLEINST_TOP=$withval
+ ;;
+ esac
+
+ if test "$ORACLEINST_TOP" != ""
+ then
+
+ # Oracle include files
+
+ if test -f "$ORACLEINST_TOP/rdbms/public/ocidfn.h"
+ then
+ # V8.0.5
+ ORACLE_INCLUDE="$ORACLE_INCLUDE -I$ORACLEINST_TOP/rdbms/public"
+ elif test -f "$ORACLEINST_TOP/rdbms/demo/ocidfn.h"
+ then
+ # V7.[0123]
+ ORACLE_INCLUDE=-I$ORACLEINST_TOP/rdbms/demo
+ fi
+
+ if test -d "$ORACLEINST_TOP/network/public"
+ then
+ # V8
+ ORACLE_INCLUDE="$ORACLE_INCLUDE -I$ORACLEINST_TOP/network/public"
+ fi
+
+ if test -d "$ORACLEINST_TOP/plsql/public"
+ then
+ # V8
+ ORACLE_INCLUDE="$ORACLE_INCLUDE -I$ORACLEINST_TOP/plsql/public"
+ fi
+
+ # Need to know the version, otherwhise we will mixup nlsrtl
+ AC_ORACLE_VERSION($ORACLEINST_TOP)
+
+ # Oracle libs - nightmare :-)
+
+ ORACLE_LIBDIR=lib
+ ORACLE_LFLAGS="-L$ORACLEINST_TOP/$ORACLE_LIBDIR ${ld_runpath_switch}$ORACLEINST_TOP/$ORACLE_LIBDIR"
+ if test -f "$ORACLEINST_TOP/rdbms/lib/sysliblist"
+ then
+ ORA_SYSLIB="`cat $ORACLEINST_TOP/rdbms/lib/sysliblist`"
+ else
+ ORA_SYSLIB="-lm"
+ fi
+
+ # Oracle Static libs
+ case $ORACLE_VERSION in
+ 7.0|7.1)
+ ORACLE_STLIBS="-locic $ORACLEINST_TOP/$ORACLE_LIBDIR/osntab.o \
+ -lsqlnet -lora -lsqlnet -lnlsrtl -lcv6 -lcore -lnlsrtl -lcv6 \
+ -lcore $ORA_SYSLIB -lcore $ORA_SYSLIB"
+ if test "`uname -s 2>/dev/null`" = "AIX"; then
+ ORACLE_STLIBS="$ORACLE_STLIBS -bI:$ORACLE_HOME/lib/mili.exp"
+ fi
+ ;;
+ 7.2)
+ ORACLE_STLIBS="-locic $ORACLEINST_TOP/$ORACLE_LIBDIR/osntab.o \
+ -lsqlnet -lora -lsqlnet -lora -lnlsrtl3 -lc3v6 -lcore3 -lnlsrtl3 \
+ -lcore3 $ORA_SYSLIB -lcore3 $ORA_SYSLIB"
+ ;;
+ 7.3)
+ ORACLE_STLIBS="-lclient -lsqlnet -lncr -lsqlnet -lclient -lcommon \
+ -lgeneric -lsqlnet -lncr -lsqlnet -lclient -lcommon -lgeneric \
+ -lepc -lnlsrtl3 -lc3v6 -lcore3 -lnlsrtl3 -lcore3 -lnlsrtl3 \
+ $ORA_SYSLIB -lcore3 $ORA_SYSLIB"
+ ;;
+ 8.0)
+ ORACLE_STLIBS="-lclient -lsqlnet -lncr -lsqlnet -lclient -lcommon \
+ -lgeneric -lsqlnet -lncr -lsqlnet -lclient -lcommon -lgeneric \
+ -lepc -lnlsrtl3 -lc3v6 -lcore4 -lnlsrtl3 -lcore4 -lnlsrtl3 \
+ $ORA_SYSLIB -lcore3 $ORA_SYSLIB"
+ ;;
+ *)
+ ORACLE_STLIBS=
+ ;;
+ esac
+
+ # Oracle shared libs
+ case $ORACLE_VERSION in
+ 7.0)
+ # shared libs not supported
+ ORACLE_SHLIBS="$ORACLE_STLIBS"
+ ;;
+ 7.1)
+ if test -f $ORACLEINST_TOP/$ORACLE_LIBDIR/liboracle.s?
+ then
+ ORACLE_SHLIBS="-loracle $ORA_SYSLIB"
+ else
+ ORACLE_SHLIBS="$ORACLE_STLIBS"
+ fi
+ ;;
+ 7.2|7.3)
+ if test -f $ORACLEINST_TOP/$ORACLE_LIBDIR/libclntsh.s?
+ then
+ ORACLE_SHLIBS="-lclntsh $ORA_SYSLIB"
+ else
+ ORACLE_SHLIBS="$ORACLE_STLIBS"
+ fi
+ ;;
+ 8.0)
+ if test -f $ORACLEINST_TOP/$ORACLE_LIBDIR/libclntsh.s? -o \
+ -f $ORACLEINST_TOP/$ORACLE_LIBDIR/libclntsh.a # AIX
+ then
+ if test "$CC" = "gcc" -a "`uname -sv`" = "AIX 4"; then
+ # for Oracle 8 on AIX 4
+ ORA_SYSLIB="$ORA_SYSLIB -nostdlib /lib/crt0_r.o /usr/lib/libpthreads.a /usr/lib/libc_r.a -lgcc"
+ fi
+ ORACLE_SHLIBS="-lclntsh -lpsa -lcore4 -lnlsrtl3 -lclntsh $ORA_SYSLIB"
+ else
+ ORACLE_SHLIBS="$ORACLE_STLIBS"
+ fi
+ AC_DEFINE(HAVE_OCI8)
+ ;;
+ *)
+ ORACLE_SHLIBS=
+ ;;
+ esac
+
+ # only using shared libs right now
+ ORACLE_LIBS=$ORACLE_SHLIBS
+
+ AC_DEFINE(HAVE_ORACLE)
+
+ fi
+
+],[AC_MSG_RESULT(no)])
+AC_SUBST(ORACLE_SHLIBS)
+AC_SUBST(ORACLE_STLIBS)
+AC_SUBST(ORACLE_LIBS)
+AC_SUBST(ORACLE_LFLAGS)
+AC_SUBST(ORACLE_INCLUDE)
+AC_SUBST(ORACLE_HOME)
+AC_SUBST(ORACLE_VERSION)
+
+
+AC_MSG_CHECKING(for iODBC support)
+AC_ARG_WITH(iodbc,
+[ --with-iodbc[=DIR] Include iODBC support. DIR is the iODBC base
+ install directory, defaults to /usr/local.],
+[
+ if test "$withval" = "yes"; then
+ withval=/usr/local
+ fi
+ if test "$withval" != "no"; then
+
+ IODBC_INCDIR=$withval/include
+ IODBC_LIBDIR=$withval/lib
+ IODBC_LFLAGS=-L$IODBC_LIBDIR
+ IODBC_INCLUDE=-I$IODBC_INCDIR
+ IODBC_LIBS=-liodbc
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_IODBC)
+
+ AC_MSG_RESULT(yes)
+
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(IODBC_LIBS)
+AC_SUBST(IODBC_LFLAGS)
+AC_SUBST(IODBC_INCLUDE)
+
+
+AC_MSG_CHECKING(for OpenLink ODBC support)
+AC_ARG_WITH(openlink,
+[ --with-openlink[=DIR] Include OpenLink ODBC support. DIR is the
+ OpenLink base install directory, defaults to
+ /usr/local/openlink.],
+[
+ if test "$withval" = "yes"; then
+ withval=/usr/local/openlink
+ fi
+ if test "$withval" != "no"; then
+
+ OPENLINK_INCDIR=$withval/odbcsdk/include
+ OPENLINK_LIBDIR=$withval/odbcsdk/lib
+ OPENLINK_LFLAGS=-L$OPENLINK_LIBDIR
+ OPENLINK_INCLUDE=-I$OPENLINK_INCDIR
+ OPENLINK_LIBS=-liodbc
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_OPENLINK)
+
+ AC_MSG_RESULT(yes)
+
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(OPENLINK_LIBS)
+AC_SUBST(OPENLINK_LFLAGS)
+AC_SUBST(OPENLINK_INCLUDE)
+
+
+AC_MSG_CHECKING(for Adabas support)
+AC_ARG_WITH(adabas,
+[ --with-adabas[=DIR] Include Adabas D support. DIR is the Adabas base
+ install directory, defaults to /usr/local.],
+[
+ if test "$withval" = "yes"; then
+ withval=/usr/local
+ fi
+ if test "$withval" != "no"; then
+ ADA_INCDIR=$withval/incl
+ ADA_LIBDIR=$withval/lib
+ ADA_LFLAGS=-L$ADA_LIBDIR
+ ADA_INCLUDE=-I$ADA_INCDIR
+ ADA_LIBS="${ADA_LIBDIR}/odbclib.a -lsqlrte -lsqlptc"
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_ADABAS)
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(ADA_LIBS)
+AC_SUBST(ADA_LFLAGS)
+AC_SUBST(ADA_INCLUDE)
+
+
+AC_MSG_CHECKING(for Sybase support)
+AC_ARG_WITH(sybase,
+[ --with-sybase[=DIR] Include Sybase-DB support. DIR is the Sybase home
+ directory, defaults to /home/sybase.],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ SYBASE_INCDIR=/home/sybase/include
+ SYBASE_LIBDIR=/home/sybase/lib
+ else
+ SYBASE_INCDIR=$withval/include
+ SYBASE_LIBDIR=$withval/lib
+ fi
+ SYBASE_INCLUDE=-I$SYBASE_INCDIR
+ SYBASE_LFLAGS="-L$SYBASE_LIBDIR -L$SYBASE_LIBDIR"
+ SYBASE_LIBS=-lsybdb
+ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(dnet_stub, dnet_addr,
+ [ SYBASE_LIBS="$SYBASE_LIBS -ldnet_stub"
+ AC_DEFINE(HAVE_LIBDNET_STUB)
+ ])
+ AC_DEFINE(HAVE_SYBASE)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(SYBASE_LIBS)
+AC_SUBST(SYBASE_LFLAGS)
+AC_SUBST(SYBASE_INCLUDE)
+
+AC_MSG_CHECKING(for Sybase-CT support)
+AC_ARG_WITH(sybase-ct,
+[ --with-sybase-ct[=DIR] Include Sybase-CT support. DIR is the Sybase home
+ directory, defaults to /home/sybase.],
+[
+ if test "$withval" != "no"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_SYBASE_CT)
+ if test "$withval" = "yes"; then
+ SYBASE_CT_INCDIR=/home/sybase/include
+ SYBASE_CT_LIBDIR=/home/sybase/lib
+ else
+ SYBASE_CT_INCDIR=$withval/include
+ SYBASE_CT_LIBDIR=$withval/lib
+ fi
+ SYBASE_CT_INCLUDE=-I$SYBASE_CT_INCDIR
+ SYBASE_CT_LFLAGS="-L$SYBASE_CT_LIBDIR"
+ SYBASE_CT_LIBS="-lcs -lct -lcomn -lintl"
+ old_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -L$SYBASE_CT_LIBDIR"
+ AC_CHECK_LIB(tcl, netg_errstr,
+ [ SYBASE_CT_LIBS="$SYBASE_CT_LIBS -ltcl" ],
+ [ SYBASE_CT_LIBS="$SYBASE_CT_LIBS -lsybtcl" ],
+ [ $SYBASE_CT_LIBS ])
+ AC_CHECK_LIB(insck, insck__getVdate,
+ [ SYBASE_CT_LIBS="$SYBASE_CT_LIBS -linsck" ])
+ LDFLAGS=$old_LDFLAGS
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(SYBASE_CT_LIBS)
+AC_SUBST(SYBASE_CT_LFLAGS)
+AC_SUBST(SYBASE_CT_INCLUDE)
+
+
+AC_MSG_CHECKING(for MySQL support)
+AC_ARG_WITH(mysql,
+[ --with-mysql[=DIR] Include MySQL support. DIR is the MySQL base
+ install directory, defaults to /usr/local.],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ MYSQL_INCDIR=/usr/local/include/mysql
+ MYSQL_LIBDIR=/usr/local/lib/mysql
+ else
+ if test -f $withval/include/mysql/mysql.h; then
+ MYSQL_INCDIR=$withval/include/mysql
+ MYSQL_LIBDIR=$withval/lib/mysql
+ elif test -f $withval/include/mysql.h; then
+ MYSQL_INCDIR=$withval/include
+ MYSQL_LIBDIR=$withval/lib
+ else
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR(Invalid MySQL directory - unable to find mysql.h under $withval)
+ fi
+ fi
+ MYSQL_INCLUDE=-I$MYSQL_INCDIR
+ if test -n "$APXS"; then
+ MYSQL_LFLAGS="'${apxs_runpath_switch}$MYSQL_LIBDIR' -L$MYSQL_LIBDIR"
+ else
+ MYSQL_LFLAGS="${ld_runpath_switch}$MYSQL_LIBDIR -L$MYSQL_LIBDIR"
+ fi
+ MYSQL_LIBS=-lmysqlclient
+
+ AC_DEFINE(HAVE_MYSQL)
+ AC_MSG_RESULT(yes)
+
+ dnl check for errmsg.h, which isn't installed by some versions of 3.21
+ old_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $MYSQL_INCLUDE"
+ AC_CHECK_HEADERS(errmsg.h mysql.h)
+ CPPFLAGS="$old_CPPFLAGS"
+ else
+ AC_MSG_RESULT(no)
+dnl Why are we defining HAVE_MYSQL here??
+ AC_DEFINE(HAVE_MYSQL)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(MYSQL_LIBS)
+AC_SUBST(MYSQL_LFLAGS)
+AC_SUBST(MYSQL_INCLUDE)
+
+
+AC_MSG_CHECKING(for mSQL support)
+AC_ARG_WITH(msql,
+[ --with-msql[=DIR] Include mSQL support. DIR is the mSQL base
+ install directory, defaults to /usr/local/Hughes.],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ MSQL_INCDIR=/usr/local/Hughes/include
+ MSQL_LIBDIR=/usr/local/Hughes/lib
+ else
+ MSQL_INCDIR=$withval/include
+ MSQL_LIBDIR=$withval/lib
+ fi
+ MSQL_INCLUDE=-I$MSQL_INCDIR
+ MSQL_LFLAGS=-L$MSQL_LIBDIR
+ MSQL_LIBS=-lmsql
+
+ AC_DEFINE(HAVE_MSQL)
+ AC_MSG_RESULT(yes)
+ AC_MSQL_VERSION
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(MSQL_LIBS)
+AC_SUBST(MSQL_LFLAGS)
+AC_SUBST(MSQL_INCLUDE)
+
+AC_MSG_CHECKING(for PostgresSQL support)
+AC_ARG_WITH(pgsql,
+[ --with-pgsql[=DIR] Include PostgresSQL support. DIR is the PostgresSQL
+ base install directory, defaults to /usr/local/pgsql.],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ PGSQL_INCDIR=/usr/local/pgsql/include
+ PGSQL_LIBDIR=/usr/local/pgsql/lib
+ else
+ PGSQL_INCDIR=$withval/include
+ test -d $withval/include/pgsql && PGSQL_INCDIR=$withval/include/pgsql
+ PGSQL_LIBDIR=$withval/lib
+ test -d $withval/lib/pgsql && PGSQL_LIBDIR=$withval/lib/pgsql
+ fi
+ PGSQL_INCLUDE=-I$PGSQL_INCDIR
+ PGSQL_LFLAGS=-L$PGSQL_LIBDIR
+ PGSQL_LIBS=-lpq
+
+ old_CFLAGS=$CFLAGS; old_LDFLAGS=$LDFLAGS; old_LIBS=$LIBS
+ CFLAGS="$CFLAGS $PGSQL_INCLUDE"
+ LDFLAGS="$LDFLAGS $PGSQL_LFLAGS"
+ LIBS="$LIBS $PGSQL_LIBS"
+ AC_DEFINE(HAVE_PGSQL)
+ AC_MSG_RESULT(yes)
+ AC_CHECK_FUNC(PQcmdTuples,AC_DEFINE(HAVE_PQCMDTUPLES))
+ CFLAGS=$old_CFLAGS; LDFLAGS=$old_LDFLAGS; LIBS=$old_LIBS
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(PGSQL_LIBS)
+AC_SUBST(PGSQL_LFLAGS)
+AC_SUBST(PGSQL_INCLUDE)
+
+
+AC_MSG_CHECKING(for Solid support)
+AC_ARG_WITH(solid,
+[ --with-solid[=DIR] Include Solid support. DIR is the Solid base
+ install directory, defaults to /usr/local/solid],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ SOLID_INCDIR=/usr/local/solid/include
+ SOLID_LIBDIR=/usr/local/solid/lib
+ else
+ SOLID_INCDIR=$withval/include
+ SOLID_LIBDIR=$withval/lib
+ fi
+ SOLID_INCLUDE=-I$SOLID_INCDIR
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_SOLID)
+
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+if test "$SOLID_LIBDIR" != ""; then
+ AC_FIND_SOLID_LIBS($SOLID_LIBDIR)
+fi
+AC_SUBST(SOLID_INCLUDE)
+AC_SUBST(SOLID_LIBS)
+
+
+AC_MSG_CHECKING(for Empress support)
+AC_ARG_WITH(empress,
+[ --with-empress[=DIR] Include Empress support. DIR is the Empress base
+ install directory, defaults to \$EMPRESSPATH],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ EMPRESS_INCDIR=$EMPRESSPATH/odbccl/include
+ EMPRESS_LIBDIR=$EMPRESSPATH/odbccl/lib
+ else
+ EMPRESS_INCDIR=$withval/include
+ EMPRESS_LIBDIR=$withval/lib
+ fi
+ EMPRESS_INCLUDE=-I$EMPRESS_INCDIR
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_EMPRESS)
+
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+if test "$EMPRESS_LIBDIR" != ""; then
+ AC_FIND_EMPRESS_LIBS($EMPRESS_LIBDIR)
+fi
+AC_SUBST(EMPRESS_INCLUDE)
+AC_SUBST(EMPRESS_LIBS)
+
+
+AC_MSG_CHECKING(for LDAP support)
+AC_ARG_WITH(ldap,
+[ --with-ldap[=DIR] Include LDAP support. DIR is the LDAP base
+ install directory, defaults to /usr/local/ldap],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ LDAP_INCDIR=/usr/local/ldap/include
+ LDAP_LIBDIR=/usr/local/ldap/lib
+ else
+ LDAP_INCDIR=$withval/include
+ LDAP_LIBDIR=$withval/lib
+ fi
+ LDAP_INCLUDE=-I$LDAP_INCDIR
+ LDAP_LFLAGS="-L$LDAP_LIBDIR ${ld_runpath_switch}$LDAP_LIBDIR"
+ LDAP_LIBS="-lldap -llber"
+
+ AC_DEFINE(HAVE_LDAP)
+
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(LDAP_LIBS)
+AC_SUBST(LDAP_LFLAGS)
+AC_SUBST(LDAP_INCLUDE)
+
+AC_MSG_CHECKING(for SNMP support)
+AC_ARG_WITH(snmp,
+[ --with-snmp[=DIR] Include SNMP support. DIR is the SNMP base
+ install directory, defaults to /usr/local],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ SNMP_INCDIR=/usr/local/include
+ test -d /usr/local/include/ucd-snmp && SNMP_INCDIR=/usr/local/include/ucd-snmp
+ SNMP_LIBDIR=/usr/local/lib
+ else
+ SNMP_INCDIR=$withval/include
+ test -d $withval/include/ucd-snmp && SNMP_INCDIR=$withval/include/ucd-snmp
+ SNMP_LIBDIR=$withval/lib
+ fi
+ SNMP_INCLUDE=-I$SNMP_INCDIR
+ SNMP_LFLAGS=-L$SNMP_LIBDIR
+ SNMP_LIBS="-lsnmp"
+
+ AC_DEFINE(HAVE_SNMP)
+
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(SNMP_LIBS)
+AC_SUBST(SNMP_LFLAGS)
+AC_SUBST(SNMP_INCLUDE)
+
+AC_MSG_CHECKING(for Velocis support)
+AC_ARG_WITH(velocis,
+[ --with-velocis[=DIR] Include Velocis support. DIR is the Velocis
+ base install directory, defaults to /usr/local/velocis.],
+[
+ if test "$withval" != "no"; then
+ VELOCIS_OS=`uname`
+ if test "$withval" = "yes"; then
+ VELOCIS_INCDIR=/usr/local/velocis/include
+ VELOCIS_LIBDIR=/usr/local/velocis
+ else
+ VELOCIS_INCDIR=$withval/include
+ VELOCIS_LIBDIR=$withval
+ fi
+ VELOCIS_INCLUDE=-I$VELOCIS_INCDIR
+ VELOCIS_LIBDIR="$VELOCIS_LIBDIR/bin"
+ VELOCIS_LIBS="-l_rdbc -l_sql"
+ if test $VELOCIS_OS = "FreeBSD"; then
+ VELOCIS_LIBS="$VELOCIS_LIBDIR/../lib/rdscli.a -lcompat"
+ fi
+ if test $VELOCIS_OS = "BSD/OS"; then
+ VELOCIS_LIBS="$VELOCIS_LIBDIR/../lib/rdscli.a -lcompat"
+ fi
+ old_CFLAGS=$CFLAGS; old_LDFLAGS=$LDFLAGS
+ CFLAGS="$CFLAGS $VELOCIS_INCLUDE"
+ LDFLAGS="$LDFLAGS $VELOCIS_LIBS"
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_VELOCIS)
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(VELOCIS_LIBS)
+AC_SUBST(VELOCIS_LFLAGS)
+AC_SUBST(VELOCIS_INCLUDE)
+
+AC_MSG_CHECKING(for Informix support)
+AC_ARG_WITH(informix,
+[ --with-informix[=DIR] Include Informix support. DIR is the Informix base
+ install directory, defaults to ${INFORMIXDIR:-nothing}.],
+[
+ if test "$withval" != "no"; then
+ if test "$INFORMIXDIR" = ""; then
+ INFORMIX_WARNING="
+WARNING: You asked for Informix support, but don't have \\\$INFORMIXDIR
+ environment value set up. Configuring and compiling Informix
+ support to PHP3 is impossible and has been turned off. Please
+ try again after setting up your environment."
+ AC_MSG_RESULT(no)
+ else
+ if test "$withval" = "yes"; then
+ IFX_INCDIR=$INFORMIXDIR/incl/esql
+ IFX_LIBDIR="-L$INFORMIXDIR/lib -L$INFORMIXDIR/lib/esql"
+ else
+ IFX_INCDIR=$withval/incl/esql
+ IFX_LIBDIR="-L$withval/lib -L$withval/lib/esql"
+ if test "$withval" != "$INFORMIXDIR"; then
+ INFORMIX_WARNING="
+WARNING: You specified Informix base install directory that is different
+ than your \\\$INFORMIXDIR environment variable. You'd better know
+ exactly what you are doing."
+ fi
+ fi
+ IFX_INCLUDE=-I$IFX_INCDIR
+ IFX_LFLAGS=$IFX_LIBDIR
+ if test -z "$IFX_LIBS"; then
+ IFX_LIBS=`esql -libs | sed -e 's/-lm$//'`
+ dnl -lm twice otherwise?
+ IFX_LIBS=`echo $IFX_LIBS | sed -e 's/Libraries to be used://g' -e 's/esql: error -55923: No source or object file\.//g'`
+ dnl Seems to get rid of newlines.
+ dnl According to Perl's DBD-Informix, might contain these strings.
+ else
+ dnl Allow override to use static and/or threaded libs
+ IFX_LIBS="$IFX_LIBS"
+ fi
+ CFLAGS="$CFLAGS $IFX_INCLUDE"
+ LDFLAGS="$LDFLAGS $IFX_LFLAGS"
+
+ if test "`uname -s 2>/dev/null`" = "AIX"; then
+ CFLAGS="$CFLAGS -D__H_LOCALEDEF"
+ fi
+ AC_DEFINE(HAVE_IFX)
+ AC_MSG_CHECKING([Informix version])
+ IFX_VERSION=[`esql -V | sed -ne '1 s/^[^0-9]*\([0-9]\)\.\([0-9]*\).*/\1\2/p'`]
+ if test $IFX_VERSION -ge "900"; then
+ AC_DEFINE(HAVE_IFX_IUS)
+ IFX_ESQL_FLAGS="-EDHAVE_IFX_IUS"
+ else
+ IFX_ESQL_FLAGS="-EUHAVE_IFX_IUS"
+ fi
+ AC_SUBST(IFX_ESQL_FLAGS)
+ AC_DEFINE_UNQUOTED(IFX_VERSION, $IFX_VERSION)
+ AC_MSG_RESULT(yes)
+ fi
+ else
+ INFORMIXDIR=
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(IFX_LIBS)
+AC_SUBST(IFX_LFLAGS)
+AC_SUBST(IFX_INCLUDE)
+AC_SUBST(INFORMIXDIR)
+
+AC_MSG_CHECKING(for InterBase support)
+AC_ARG_WITH(interbase,
+[ --with-interbase[=DIR] Include InterBase support. DIR is the InterBase base
+ install directory, defaults to /usr/interbase],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ IBASE_INCDIR=/usr/interbase/include
+ IBASE_LIBDIR=/usr/interbase/lib
+ else
+ IBASE_INCDIR=$withval/include
+ IBASE_LIBDIR=$withval/lib
+ fi
+ IBASE_INCLUDE=-I$IBASE_INCDIR
+ IBASE_LFLAGS=-L$IBASE_LIBDIR
+ IBASE_LIBS="-lgds"
+
+ AC_DEFINE(HAVE_IBASE)
+
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(IBASE_INCLUDE)
+AC_SUBST(IBASE_LIBS)
+AC_SUBST(IBASE_LFLAGS)
+
+AC_MSG_CHECKING(for a custom ODBC support)
+AC_ARG_WITH(custom-odbc,
+[ --with-custom-odbc[=DIR] Include a user defined ODBC support.
+ The DIR is ODBC install base directory,
+ which defaults to /usr/local.
+ Make sure to define CUSTOM_ODBC_LIBS and
+ have some odbc.h in your include dirs.
+ E.g., you should define following for
+ Sybase SQL Anywhere 5.5.00 on QNX, prior to
+ run configure script:
+ CFLAGS=\"-DODBC_QNX -DSQLANY_BUG\"
+ LDFLAGS=-lunix
+ CUSTOM_ODBC_LIBS=\"-ldblib -lodbc\".],
+[
+ if test "$withval" = "yes"; then
+ withval=/usr/local
+ fi
+ if test "$withval" != "no"; then
+
+ CODBC_INCDIR=$withval/include
+ CODBC_LIBDIR=$withval/lib
+ CODBC_LFLAGS=-L$CODBC_LIBDIR
+ CODBC_INCLUDE=-I$CODBC_INCDIR
+ CODBC_LIBS=$CUSTOM_ODBC_LIBS
+ UODBC_DEFAULT=yes
+
+ AC_DEFINE(HAVE_CODBC)
+
+ AC_MSG_RESULT(yes)
+
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(CODBC_LIBS)
+AC_SUBST(CODBC_LFLAGS)
+AC_SUBST(CODBC_INCLUDE)
+
+
+AC_MSG_CHECKING(for Hyperwave support)
+AC_ARG_WITH(hyperwave,
+[ --with-hyperwave Include Hyperwave support],
+[
+ if test "$withval" != "no"; then
+ AC_DEFINE(HYPERWAVE,1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(HYPERWAVE,0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(HYPERWAVE,0)
+ AC_MSG_RESULT(no)
+])
+
+
+AC_MSG_CHECKING(for XML support)
+AC_ARG_WITH(xml,
+[ --with-xml Include XML support],[
+ if test "$withval" = "yes"; then
+ AC_DEFINE(HAVE_LIBEXPAT, 1)
+ AC_MSG_RESULT(yes)
+ XML_LIBS="-lexpat"
+ else
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(XML_LIBS)
+
+
+AC_MSG_CHECKING(whether to include zlib support)
+AC_ARG_WITH(zlib,
+[ --with-zlib[=DIR] Include zlib support (requires zlib >= 1.0.9).
+ DIR is the zlib install directory,
+ defaults to /usr.],
+[
+ case "$withval" in
+ no)
+ AC_MSG_RESULT(no) ;;
+ yes)
+ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(z, gzgets, [AC_DEFINE(HAVE_ZLIB) ZLIB_LIBS="-lz"],
+ [AC_MSG_ERROR(Zlib module requires zlib >= 1.0.9.)]) ;;
+ *)
+ test -f $withval/include/zlib/zlib.h && ZLIB_INCLUDE="-I$withval/include/zlib"
+ test -f $withval/include/zlib.h && ZLIB_INCLUDE="-I$withval/include"
+ if test -n "$ZLIB_INCLUDE" ; then
+ AC_MSG_RESULT(yes)
+ old_LIBS=$LIBS
+ LIBS="$LIBS -L$withval/lib"
+ AC_CHECK_LIB(z, gzgets, [AC_DEFINE(HAVE_ZLIB) ZLIB_LIBS="-L$withval/lib -lz"],
+ [AC_MSG_ERROR(Zlib module requires zlib >= 1.0.9.)])
+ LIBS=$old_LIBS
+ else
+ AC_MSG_RESULT(no)
+ fi ;;
+ esac
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(ZLIB_LIBS)
+AC_SUBST(ZLIB_INCLUDE)
+
+
+AC_MSG_CHECKING(whether to include pdflib support)
+AC_ARG_WITH(pdflib,
+[ --with-pdflib[=DIR] Include pdflib support (tested with 0.6).
+ DIR is the pdflib install directory,
+ defaults to /usr/local.],
+[
+ case "$withval" in
+ no)
+ AC_MSG_RESULT(no) ;;
+ yes)
+ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(pdf, PDF_open, [AC_DEFINE(HAVE_PDFLIB) PDFLIB_LIBS="-lpdf"],
+ [AC_MSG_ERROR(pdflib module requires pdflib 0.6)]) ;;
+ *)
+ test -f $withval/include/pdf.h && PDFLIB_INCLUDE="-I$withval/include"
+ if test -n "$PDFLIB_INCLUDE" ; then
+ AC_MSG_RESULT(yes)
+ old_LIBS=$LIBS
+ LIBS="$LIBS -L$withval/lib"
+ AC_CHECK_LIB(pdf, PDF_open, [AC_DEFINE(HAVE_PDFLIB) PDFLIB_LIBS="-L$withval/lib -lpdf"],
+ [AC_MSG_ERROR(pdflib module requires pdflib 0.6.)])
+ LIBS=$old_LIBS
+ else
+ AC_MSG_RESULT(no)
+ fi ;;
+ esac
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(PDFLIB_LIBS)
+AC_SUBST(PDFLIB_INCLUDE)
+
+
+AC_MSG_CHECKING(whether to include fdftk support)
+AC_ARG_WITH(fdftk,
+[ --with-fdftk[=DIR] Include fdftk support.
+ DIR is the fdftk lib install directory,
+ defaults to /usr/local.],
+[
+ case "$withval" in
+ no)
+ AC_MSG_RESULT(no) ;;
+ yes)
+ AC_MSG_RESULT(yes)
+ AC_CHECK_LIB(FdfTk, FDFOpen, [AC_DEFINE(HAVE_FDFLIB) FDFLIB_LIBS="-lFdfTk"],
+ [AC_MSG_ERROR(fdftk module requires fdftk 2.0)]) ;;
+ *)
+ test -f $withval/include/Fdftk.h && FDFLIB_INCLUDE="-I$withval/include"
+ if test -n "$FDFLIB_INCLUDE" ; then
+ AC_MSG_RESULT(yes)
+ old_LIBS=$LIBS
+ LIBS="$LIBS -L$withval/lib"
+ AC_CHECK_LIB(FdfTk, FDFOpen, [AC_DEFINE(HAVE_FDFLIB) FDFLIB_LIBS="-L$withval/lib -lFdfTk"],
+ [AC_MSG_ERROR(fdftk module requires ftftk lib 2.0.)])
+ LIBS=$old_LIBS
+ else
+ AC_MSG_RESULT(no)
+ fi ;;
+ esac
+],[
+ AC_MSG_RESULT(no)
+])
+AC_SUBST(FDFLIB_LIBS)
+AC_SUBST(FDFLIB_INCLUDE)
+
+
+AC_MSG_CHECKING(whether to include the bundled dbase library)
+AC_ARG_WITH(dbase,
+[ --with-dbase Include the bundled dbase library],
+[
+ if test "$withval" = "yes"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(DBASE,1)
+ DBASE_LIB=dbase/libdbf.a
+ else
+ AC_MSG_RESULT(no)
+ AC_DEFINE(DBASE,0)
+ DBASE_LIB=
+ fi
+],[
+ AC_MSG_RESULT(no)
+ AC_DEFINE(DBASE,0)
+ DBASE_LIB=
+])
+AC_SUBST(DBASE_LIB)
+
+
+AC_MSG_CHECKING(whether to include the bundled filePro support)
+AC_ARG_WITH(filepro,
+[ --with-filepro Include the bundled read-only filePro support],[
+ if test "$withval" = "yes"; then
+ AC_DEFINE(HAVE_FILEPRO, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(HAVE_FILEPRO, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(HAVE_FILEPRO, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+AC_MSG_CHECKING(whether to enable DAV support through mod_dav)
+AC_ARG_WITH(mod-dav,
+[ --with-mod-dav=DIR Include DAV support through Apache's mod_dav,
+ DIR is mod_dav's installation directory (Apache
+ module version only!)],
+[
+ if test "$withval" = "yes"; then
+ AC_MSG_ERROR(Must give parameter to --with-mod-dav!)
+ else
+ if test "$withval" != "no"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_MOD_DAV, 1)
+ MOD_DAV_CFLAGS="-DHAVE_MOD_DAV -I$withval"
+ APACHE_INCLUDE="$APACHE_INCLUDE -I$withval"
+ else
+ AC_MSG_RESULT(no)
+ AC_DEFINE(HAVE_MOD_DAV, 0)
+ fi
+ fi
+],[
+ AC_MSG_RESULT(no)
+ AC_DEFINE(HAVE_MOD_DAV, 0)
+])
+AC_SUBST(MOD_DAV_CFLAGS)
+
+AC_MSG_CHECKING(whether to enable unified ODBC support)
+AC_ARG_ENABLE(unified-odbc,
+[ --disable-unified-odbc Disable unified ODBC support. Only applicable if
+ iODBC, Adabas, Solid, Velocis or a custom ODBC
+ interface is enabled.],
+[
+ if test "$enableval" = "no"; then
+ AC_DEFINE(HAVE_UODBC, 0)
+ AC_MSG_RESULT(no)
+ else
+ if test "$with_solid" != ""; then
+ UODBC_TYPE=solid
+ elif test "$with_iodbc" != ""; then
+ UODBC_TYPE=iodbc
+ elif test "$with_adabas" != ""; then
+ UODBC_TYPE=adabas
+ elif test "$with_velocis" != ""; then
+ UODBC_TYPE=velocis
+ elif test "$with_custom_odbc" != ""; then
+ UODBC_TYPE=custom
+ else
+ AC_MSG_ERROR([no ODBC library! Include Solid, iODBC, Velocis, Adabas D or a custom ODBC support.])
+ fi
+ AC_DEFINE(HAVE_UODBC, 1)
+ AC_MSG_RESULT([yes, using $UODBC_TYPE])
+ fi
+],[
+ if test "$UODBC_DEFAULT" = "yes"; then
+ AC_DEFINE(HAVE_UODBC, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(HAVE_UODBC, 0)
+ AC_MSG_RESULT(no)
+ fi
+])
+
+
+
+
+
+
+
+AC_MSG_CHECKING(whether to use a configuration file)
+AC_ARG_WITH(config-file-path,
+[ --with-config-file-path=PATH Sets the path in which to look for php3.ini
+ defaults to /usr/local/lib],
+[
+ if test "$withval" = "yes"; then
+ AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "/usr/local/lib")
+ AC_DEFINE(USE_CONFIG_FILE, 1)
+ AC_MSG_RESULT(yes)
+ else
+ if test "$withval" != "no"; then
+ AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "$withval")
+ AC_DEFINE(USE_CONFIG_FILE, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(CONFIGURATION_FILE_PATH, 0)
+ AC_DEFINE(USE_CONFIG_FILE, 0)
+ AC_MSG_RESULT(no)
+ fi
+ fi
+],[
+ AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "/usr/local/lib")
+ AC_DEFINE(USE_CONFIG_FILE, 1)
+ AC_MSG_RESULT(yes)
+])
+
+
+AC_MSG_CHECKING(whether to include debugging symbols)
+AC_ARG_ENABLE(debug,
+[ --enable-debug Compile with debugging symbols],
+[
+ if test "$enableval" = "yes"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(DEBUG,1)
+ PHP_DEBUG=1
+ DEBUG_CFLAGS="-g"
+ test -n "$GCC" && DEBUG_CFLAGS="$DEBUG_CFLAGS -Wall"
+ test -n "$GCC" && test "$USE_MAINTAINER_MODE" = "yes" && \
+ DEBUG_CFLAGS="$DEBUG_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations"
+ else
+ AC_MSG_RESULT(no)
+ AC_DEFINE(DEBUG,0)
+ PHP_DEBUG=0
+ DEBUG_CFLAGS=""
+ fi
+],[
+ AC_MSG_RESULT(no)
+ AC_DEFINE(DEBUG,0)
+ PHP_DEBUG=0
+ DEBUG_CFLAGS=""
+])
+AC_SUBST(DEBUG_CFLAGS)
+AC_SUBST(PHP_DEBUG)
+
+
+AC_MSG_CHECKING(whether to enable safe mode by default)
+AC_ARG_ENABLE(safe-mode,
+[ --enable-safe-mode Enable safe mode by default.],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(PHP_SAFE_MODE, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(PHP_SAFE_MODE, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(PHP_SAFE_MODE, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+AC_MSG_CHECKING(for safe mode exec dir)
+AC_ARG_WITH(exec-dir,
+[ --with-exec-dir[=DIR] Only allow executables in DIR when in safe mode
+ defaults to /usr/local/php/bin],
+[
+ if test "$withval" != "no"; then
+ if test "$withval" = "yes"; then
+ AC_DEFINE(PHP_SAFE_MODE_EXEC_DIR,"/usr/local/php/bin")
+ AC_MSG_RESULT(/usr/local/php/bin)
+ else
+ AC_DEFINE_UNQUOTED(PHP_SAFE_MODE_EXEC_DIR,"$withval")
+ AC_MSG_RESULT($withval)
+ fi
+ else
+ AC_DEFINE(PHP_SAFE_MODE_EXEC_DIR,"/usr/local/php/bin")
+ AC_MSG_RESULT(/usr/local/php/bin)
+ fi
+],[
+ AC_DEFINE(PHP_SAFE_MODE_EXEC_DIR,"/usr/local/php/bin")
+ AC_MSG_RESULT(/usr/local/php/bin)
+])
+
+
+AC_MSG_CHECKING(whether to enable track_vars variables by default)
+AC_ARG_ENABLE(track-vars,
+[ --enable-track-vars Enable GET/POST/Cookie track variables by default.],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(PHP_TRACK_VARS, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(PHP_TRACK_VARS, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(PHP_TRACK_VARS, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+AC_MSG_CHECKING(whether to enable magic quotes by default)
+AC_ARG_ENABLE(magic-quotes,
+[ --enable-magic-quotes Enable magic quotes by default.],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(MAGIC_QUOTES, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(MAGIC_QUOTES, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(MAGIC_QUOTES, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+dnl AC_MSG_CHECKING(whether to enable PHP RPC support)
+dnl AC_ARG_ENABLE(php-rpc,
+dnl [ --enable-php-rpc Compile with PHP RPC support.],
+dnl [
+dnl if test "$enableval" = "yes"; then
+dnl AC_DEFINE(PHP_RPC, 1)
+dnl AC_MSG_RESULT(yes)
+dnl else
+dnl AC_DEFINE(PHP_RPC, 0)
+dnl AC_MSG_RESULT(no)
+dnl fi
+dnl ],[
+dnl AC_DEFINE(PHP_RPC, 0)
+dnl AC_MSG_RESULT(no)
+dnl ])
+
+AC_MSG_CHECKING(whether to enable bc style precision math functions)
+AC_ARG_ENABLE(bcmath,
+[ --disable-bcmath Compile without bc style precision math functions. ],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(WITH_BCMATH, 1)
+ AC_MSG_RESULT(yes)
+ BCMATH_SRC="functions/bcmath.c functions/number.c"
+ else
+ AC_DEFINE(WITH_BCMATH, 0)
+ AC_MSG_RESULT(no)
+ BCMATH_SRC=""
+ fi
+],[
+ AC_DEFINE(WITH_BCMATH, 1)
+ AC_MSG_RESULT(yes)
+ BCMATH_SRC="functions/bcmath.c functions/number.c"
+])
+AC_SUBST(BCMATH_SRC)
+
+if test "$BINNAME" = "php"; then
+AC_MSG_CHECKING(whether to force Apache CGI redirect)
+AC_ARG_ENABLE(force-cgi-redirect,
+[ --enable-force-cgi-redirect Enable the security check for internal server
+ redirects. You should use this if you are
+ running the CGI version with Apache. ],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(FORCE_CGI_REDIRECT, 1)
+ AC_MSG_RESULT(yes)
+ REDIRECT=1
+ else
+ AC_DEFINE(FORCE_CGI_REDIRECT, 0)
+ AC_MSG_RESULT(no)
+ REDIRECT=0
+ fi
+],[
+ AC_DEFINE(FORCE_CGI_REDIRECT, 0)
+ AC_MSG_RESULT(no)
+ REDIRECT=0
+])
+
+AC_MSG_CHECKING(whether to discard path_info + path_translated)
+AC_ARG_ENABLE(discard_path,
+[ --enable-discard-path If this is enabled, the PHP CGI binary
+ can safely be placed outside of the
+ web tree and people will not be able
+ to circumvent .htaccess security. ],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(DISCARD_PATH, 1)
+ AC_MSG_RESULT(yes)
+ DISCARD_PATH=1
+ else
+ AC_DEFINE(DISCARD_PATH, 0)
+ AC_MSG_RESULT(no)
+ DISCARD_PATH=0
+ fi
+],[
+ AC_DEFINE(DISCARD_PATH, 0)
+ AC_MSG_RESULT(no)
+ DISCARD_PATH=0
+])
+fi
+
+AC_MSG_CHECKING(whether to enable a memory limit)
+AC_ARG_ENABLE(memory-limit,
+[ --enable-memory-limit Compile with memory limit support. ],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(MEMORY_LIMIT, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(MEMORY_LIMIT, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(MEMORY_LIMIT, 0)
+ AC_MSG_RESULT(no)
+])
+
+AC_MSG_CHECKING(whether to enable short tags by default)
+AC_ARG_ENABLE(short-tags,
+[ --disable-short-tags Disable the short-form <? start tag by default.],
+[
+ if test "$enableval" = "no"; then
+ AC_DEFINE(DEFAULT_SHORT_OPEN_TAG, 0)
+ AC_MSG_RESULT(no)
+ else
+ AC_DEFINE(DEFAULT_SHORT_OPEN_TAG, 1)
+ AC_MSG_RESULT(yes)
+ fi
+],[
+ AC_DEFINE(DEFAULT_SHORT_OPEN_TAG, 1)
+ AC_MSG_RESULT(yes)
+])
+
+AC_MSG_CHECKING(whether to enable the URL-aware fopen wrapper)
+AC_ARG_ENABLE(url-fopen-wrapper,
+[ --disable-url-fopen-wrapper Disable the URL-aware fopen wrapper that allows
+ accessing files via http or ftp.],
+[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(PHP3_URL_FOPEN, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(PHP3_URL_FOPEN, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(PHP3_URL_FOPEN, 1)
+ AC_MSG_RESULT(yes)
+])
+
+AC_MSG_CHECKING(whether to enable System V semaphore support)
+AC_ARG_ENABLE(sysvsem,
+[ --enable-sysvsem Enable System V semaphore support.],
+[
+ if test "$enableval" = "yes"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_SYSVSEM, 1)
+ AC_CACHE_CHECK(for union semun,php_cv_semun,
+ AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+ ],
+ [union semun x;],
+ [
+ php_cv_semun=yes
+ ],[
+ php_cv_semun=no
+ ])
+ )
+ if test $php_cv_semun = "yes"; then
+ AC_DEFINE(HAVE_SEMUN, 1)
+ else
+ AC_DEFINE(HAVE_SEMUN, 0)
+ fi
+ else
+ AC_MSG_RESULT(no)
+ AC_DEFINE(HAVE_SYSVSEM, 0)
+ fi
+],[
+ AC_MSG_RESULT(no)
+ AC_DEFINE(HAVE_SYSVSEM, 0)
+])
+
+
+AC_MSG_CHECKING(whether to enable System V shared memory support)
+AC_ARG_ENABLE(sysvshm,
+[ --enable-sysvshm Enable the System V shared memory support],[
+ if test "$enableval" = "yes"; then
+ AC_DEFINE(HAVE_SYSVSHM, 1)
+ AC_MSG_RESULT(yes)
+ else
+ AC_DEFINE(HAVE_SYSVSHM, 0)
+ AC_MSG_RESULT(no)
+ fi
+],[
+ AC_DEFINE(HAVE_SYSVSHM, 0)
+ AC_MSG_RESULT(no)
+])
+
+
+dnl If we're using gcc and the user hasn't specified CFLAGS, add -O2.
+test -n "$auto_cflags" && test -n "$GCC" && CFLAGS="$CFLAGS -O2"
+
+dnl If we're using cc on HP-UX, add the -Ae to CFLAGS
+if test -n "$auto_cflags" && test "`uname -s 2>/dev/null`" = "HP-UX"; then
+ test -n "$GCC" || CFLAGS="-Ae $CFLAGS"
+fi
+
+dnl *** Commented out - generates slow code and consumes a lot of
+dnl *** resources during compilation - we need to figure out how
+dnl *** to supply it only when absolutely necessary
+dnl If we're using gcc add -fpic to make dl() work on some platforms
+dnl test -n "$GCC" && CFLAGS="$CFLAGS -fpic"
+
+LIBS="${LIBS} -lzend"
+
+AC_SUBST(CFLAGS)
+AC_SUBST(PROG_SENDMAIL)
+AC_SUBST(CFLAGS_SHLIB)
+AC_SUBST(LDFLAGS_SHLIB)
+AC_SUBST(LDFLAGS_SHLIB_EXPORT)
+
+dnl Create the necessary directories if building using VPATH
+if test ! -d functions; then
+ mkdir functions
+fi
+if test ! -d extra; then
+ mkdir extra
+fi
+if test ! -d extra/gd; then
+ mkdir extra/gd
+fi
+
+PHP_BUILD_DATE=`date '+%Y-%m-%d'`
+AC_SUBST(PHP_BUILD_DATE)
+AC_DEFINE_UNQUOTED(PHP_BUILD_DATE,"$PHP_BUILD_DATE")
+PHP_UNAME=`uname -a`
+AC_DEFINE_UNQUOTED(PHP_UNAME,"$PHP_UNAME")
+PHP_OS=`uname`
+AC_DEFINE_UNQUOTED(PHP_OS,"$PHP_OS")
+
+AC_OUTPUT(Makefile build-defs.h stamp-h libphp3.module doc/Makefile
+ doc/version.ent doc/checkdoc extra/gd/bdf2gdfont regex/Makefile
+ dbase/Makefile, [
+ chmod +x doc/checkdoc extra/gd/bdf2gdfont
+], [
+
+dnl Warn about CGI version with no extra security options.
+if test "$BINNAME" = "php"; then
+ if test "$REDIRECT" = "0"; then
+ if test "$DISCARD_PATH" = "0"; then
+ echo "WARNING: You will be compiling the CGI version of PHP without any"
+ echo " redirection checking. By putting this cgi binary somewhere"
+ echo " in your web space, users may be able to circumvent existing .htaccess"
+ echo " security by loading files directly through the parser. See"
+ echo " http://www.php.net/manual/config-security.php3 for more details."
+ fi
+ fi
+fi
+dnl Warn if Informix support was requested but environment is not set up correctly.
+if test "$INFORMIX_WARNING" != ""; then
+ echo "$INFORMIX_WARNING"
+fi
+])
+# Local Variables:
+# tab-width: 4
+# End:
diff --git a/control_structures.h b/control_structures.h
new file mode 100644
index 0000000..cde2a9e
--- /dev/null
+++ b/control_structures.h
@@ -0,0 +1,46 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP HTML Embedded Scripting Language Version 3.0 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997,1998 PHP Development Team (See Credits file) |
+ +----------------------------------------------------------------------+
+ | This program is free software; you can redistribute it and/or modify |
+ | it under the terms of one of the following licenses: |
+ | |
+ | A) the GNU General Public License as published by the Free Software |
+ | Foundation; either version 2 of the License, or (at your option) |
+ | any later version. |
+ | |
+ | B) the PHP License as published by the PHP Development Team and |
+ | included in the distribution in the file: LICENSE |
+ | |
+ | This program is distributed in the hope that it will be useful, |
+ | but WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+ | GNU General Public License for more details. |
+ | |
+ | You should have received a copy of both licenses referred to here. |
+ | If you did not, or have any questions about PHP licensing, please |
+ | contact core@php.net. |
+ +----------------------------------------------------------------------+
+ | Authors: Andi Gutmans <andi@zend.com> |
+ | Zeev Suraski <zeev@zend.com> |
+ +----------------------------------------------------------------------+
+ */
+
+
+/* $Id$ */
+
+
+#ifndef _CONTROL_STRUCTURES_H
+#define _CONTROL_STRUCTURES_H
+
+#ifndef THREAD_SAFE
+extern unsigned int param_index;
+extern char *class_name;
+extern HashTable *class_symbol_table;
+#endif
+
+extern inline void start_display_source(int start_in_php INLINE_TLS);
+
+#endif
diff --git a/crypt.mak b/crypt.mak
new file mode 100644
index 0000000..9488b28
--- /dev/null
+++ b/crypt.mak
@@ -0,0 +1,204 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on crypt.dsp
+!IF "$(CFG)" == ""
+CFG=crypt - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to crypt - Win32 Debug.
+!ENDIF
+
+!IF "$(CFG)" != "crypt - Win32 Release" && "$(CFG)" != "crypt - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "crypt.mak" CFG="crypt - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "crypt - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "crypt - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+!IF "$(CFG)" == "crypt - Win32 Release"
+
+OUTDIR=.\module_Release
+INTDIR=.\module_Release
+# Begin Custom Macros
+OutDir=.\module_Release
+# End Custom Macros
+
+ALL : "$(OUTDIR)\php3_crypt.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\crypt.obj"
+ -@erase "$(INTDIR)\sflcryp.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(OUTDIR)\php3_crypt.dll"
+ -@erase "$(OUTDIR)\php3_crypt.exp"
+ -@erase "$(OUTDIR)\php3_crypt.lib"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MT /W3 /GX /O2 /I "./" /I "../" /D HAVE_SFLCRYPT=1 /D "COMPILE_DL" /D "MSVC5" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Fp"$(INTDIR)\crypt.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\crypt.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=php.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\php3_crypt.pdb" /machine:I386 /out:"$(OUTDIR)\php3_crypt.dll" /implib:"$(OUTDIR)\php3_crypt.lib" /libpath:"cgi_release"
+LINK32_OBJS= \
+ "$(INTDIR)\crypt.obj" \
+ "$(INTDIR)\sflcryp.obj"
+
+"$(OUTDIR)\php3_crypt.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "crypt - Win32 Debug"
+
+OUTDIR=.\module_debug
+INTDIR=.\module_debug
+# Begin Custom Macros
+OutDir=.\module_debug
+# End Custom Macros
+
+ALL : "$(OUTDIR)\php3_crypt.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\crypt.obj"
+ -@erase "$(INTDIR)\sflcryp.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(OUTDIR)\php3_crypt.dll"
+ -@erase "$(OUTDIR)\php3_crypt.exp"
+ -@erase "$(OUTDIR)\php3_crypt.ilk"
+ -@erase "$(OUTDIR)\php3_crypt.lib"
+ -@erase "$(OUTDIR)\php3_crypt.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MTd /W3 /Gm /GX /ZI /Od /I "./" /I "../" /I "../../" /D HAVE_SFLCRYPT=1 /D "DEBUG" /D "COMPILE_DL" /D "MSVC5" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /Fp"$(INTDIR)\crypt.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\crypt.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=php.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"$(OUTDIR)\php3_crypt.pdb" /debug /machine:I386 /out:"$(OUTDIR)\php3_crypt.dll" /implib:"$(OUTDIR)\php3_crypt.lib" /pdbtype:sept /libpath:"cgi_debug"
+LINK32_OBJS= \
+ "$(INTDIR)\crypt.obj" \
+ "$(INTDIR)\sflcryp.obj"
+
+"$(OUTDIR)\php3_crypt.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF
+
+
+!IF "$(NO_EXTERNAL_DEPS)" != "1"
+!IF EXISTS("crypt.dep")
+!INCLUDE "crypt.dep"
+!ELSE
+!MESSAGE Warning: cannot find "crypt.dep"
+!ENDIF
+!ENDIF
+
+
+!IF "$(CFG)" == "crypt - Win32 Release" || "$(CFG)" == "crypt - Win32 Debug"
+SOURCE=.\dl\crypt\crypt.c
+
+"$(INTDIR)\crypt.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\dl\crypt\sflcryp.c
+
+"$(INTDIR)\sflcryp.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+
+!ENDIF
+
diff --git a/cvsusers b/cvsusers
new file mode 100644
index 0000000..9763c24
--- /dev/null
+++ b/cvsusers
@@ -0,0 +1,62 @@
+CVS login Name Email Works on
+andi Andi Gutmans andi@php.net Core + API
+jim Jim Winstead jimw@php.net Everything
+rasmus Rasmus Lerdorf rasmus@php.net Everything
+shane Shane Caraveo shane@php.net WIN32 + API
+ssb Stig Bakken stig@php.net Everything
+zeev Zeev Suraski zeev@php.net Everything
+jaakko Jaakko Hyvatti jaakko@hyvatti.iki.fi Everything
+veebert Rex Logan veebert@dimensional.com IMAP
+chad Chad Robinson chadr@brttech.com Documentation
+myddryn PostgreSQL
+wojtek
+mitch Mitch Golden Oracle
+brian
+lr Lachlan Roche lr@www.wwi.com.au MD5
+damian
+ian
+jah Jouni Ahto jah@cultnet.fi Postgres, Informix
+adam
+amitay Amitay Isaacs amitay@w-o-i.com LDAP
+dizzy
+mark
+guy
+jeffhu Jeffrey Hulten jeffh@premier1.net WIN32 + modules(?)
+eschmid Egon Schmid eschmid@delos.lf.net Documentation
+cslawi Torben Wilson torben@netmill.com Documentation
+bwk
+eric
+tcobb Troy Cobb www
+gareth www
+willer Steve Willer willer@interlog.com pack
+cmv Colin Viebrock cmv@privateworld.com www
+soderman
+tin
+musone Mark Musone musone@afterfive.com IMAP
+abelits Alex Belits abelits@phobos.illtel.denver.co.us fhttpd module
+ars Ariel Shkedi ars@ziplink.net setup
+mag Nikolay P. Romanyuk mag@redcom.ru Raima DB
+rse Ralf S. Engelschall rse@engelschall.com Apache configuration
+sr Stefan Roehrich sr@linux.de zlib module
+owl Igor Kovalenko owl@infomarket.ru QNX support
+pcurtis Paul Curtis pcurtis@netscape.com NSAPI work (??)
+lynch Richard Lynch lynch@lscorp.com Documentation
+steffann Sander Steffann steffann@nederland.net Safe Mode
+wdiestel Wolfram Diestel wdiestel@debis.com Oracle WebServer cartridge
+fmk Frank M. Kromann fmk@businessnet.dk Direct MS-SQL, NaVision, Lotus Notes
+steinm Uwe Steinmann Uwe.Steinmann@fernuni-hagen.de Hyperwave Module
+danny Danny Heijl Danny.Heijl@cevi.be Informix
+kara Andreas Karajannis Andreas.Karajannis@gmd.de ODBC, Oracle
+nyenyon Christian Cartus chc@idgruppe.de Informix
+kk Kristian Köhntopp kk@shonline.de Documentation
+ted Ted Rolle ted.rolle@usa.net Documentation
+holger Holger Zimmermann zimpel@t-online.de Pi3Web support
+sgk Shigeru Kanemoto sgk@happysize.co.jp Japanese language support
+jimjag Jim Jagielski jim@jaguNET.com Misc scraps
+martin Martin Kraemer Martin.Kraemer@Mch.SNI.De EBCDIC (BS2000 mainframe port)
+kwazy Landon Bradshaw landon@bradshaw.org Documentation
+thies Thies C. Arntzen thies@digicol.de implement IPTC reader, maybe some oracle stuff
+cschneid Christian Schneider cschneid@relog.ch gzip run-time encoding of output stream
+tommay Tom May tom@go2net.com Sybase-CT
+swilliam Steve Williams swilliam@empress.com Empress support in unified ODBC
+sas Sascha Schumann sas@schell.de Various tweaks
diff --git a/dbase.mak b/dbase.mak
new file mode 100644
index 0000000..d1dfd30
--- /dev/null
+++ b/dbase.mak
@@ -0,0 +1,234 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on dbase.dsp
+!IF "$(CFG)" == ""
+CFG=dbase - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to dbase - Win32 Debug.
+!ENDIF
+
+!IF "$(CFG)" != "dbase - Win32 Release" && "$(CFG)" != "dbase - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "dbase.mak" CFG="dbase - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "dbase - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "dbase - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+!IF "$(CFG)" == "dbase - Win32 Release"
+
+OUTDIR=.\module_release
+INTDIR=.\module_release
+# Begin Custom Macros
+OutDir=.\module_release
+# End Custom Macros
+
+ALL : "$(OUTDIR)\php3_dbase.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\dbase.obj"
+ -@erase "$(INTDIR)\dbf_head.obj"
+ -@erase "$(INTDIR)\dbf_misc.obj"
+ -@erase "$(INTDIR)\dbf_ndx.obj"
+ -@erase "$(INTDIR)\dbf_rec.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(OUTDIR)\php3_dbase.dll"
+ -@erase "$(OUTDIR)\php3_dbase.exp"
+ -@erase "$(OUTDIR)\php3_dbase.lib"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MT /W3 /GX /O2 /I "dbase\\" /I "./" /I "../" /D DBASE=1 /D "NDEBUG" /D "THREAD_SAFE" /D "COMPILE_DL" /D "MSVC5" /D "WIN32" /D "_WINDOWS" /Fp"$(INTDIR)\dbase.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\dbase.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=php.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /version:3 /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\php3_dbase.pdb" /machine:I386 /out:"$(OUTDIR)\php3_dbase.dll" /implib:"$(OUTDIR)\php3_dbase.lib" /libpath:"cgi_release"
+LINK32_OBJS= \
+ "$(INTDIR)\dbase.obj" \
+ "$(INTDIR)\dbf_head.obj" \
+ "$(INTDIR)\dbf_misc.obj" \
+ "$(INTDIR)\dbf_ndx.obj" \
+ "$(INTDIR)\dbf_rec.obj"
+
+"$(OUTDIR)\php3_dbase.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "dbase - Win32 Debug"
+
+OUTDIR=.\module_debug
+INTDIR=.\module_debug
+# Begin Custom Macros
+OutDir=.\module_debug
+# End Custom Macros
+
+ALL : "$(OUTDIR)\php3_dbase.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\dbase.obj"
+ -@erase "$(INTDIR)\dbf_head.obj"
+ -@erase "$(INTDIR)\dbf_misc.obj"
+ -@erase "$(INTDIR)\dbf_ndx.obj"
+ -@erase "$(INTDIR)\dbf_rec.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(OUTDIR)\php3_dbase.dll"
+ -@erase "$(OUTDIR)\php3_dbase.exp"
+ -@erase "$(OUTDIR)\php3_dbase.ilk"
+ -@erase "$(OUTDIR)\php3_dbase.lib"
+ -@erase "$(OUTDIR)\php3_dbase.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MTd /W3 /Gm /GX /ZI /Od /I "dbase\\" /I "./" /I "../" /D DBASE=1 /D "DEBUG" /D "_DEBUG" /D "THREAD_SAFE" /D "COMPILE_DL" /D "MSVC5" /D "WIN32" /D "_WINDOWS" /Fp"$(INTDIR)\dbase.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\dbase.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=php.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /version:3 /subsystem:windows /dll /incremental:yes /pdb:"$(OUTDIR)\php3_dbase.pdb" /debug /machine:I386 /out:"$(OUTDIR)\php3_dbase.dll" /implib:"$(OUTDIR)\php3_dbase.lib" /pdbtype:sept /libpath:"cgi_debug"
+LINK32_OBJS= \
+ "$(INTDIR)\dbase.obj" \
+ "$(INTDIR)\dbf_head.obj" \
+ "$(INTDIR)\dbf_misc.obj" \
+ "$(INTDIR)\dbf_ndx.obj" \
+ "$(INTDIR)\dbf_rec.obj"
+
+"$(OUTDIR)\php3_dbase.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF
+
+
+!IF "$(NO_EXTERNAL_DEPS)" != "1"
+!IF EXISTS("dbase.dep")
+!INCLUDE "dbase.dep"
+!ELSE
+!MESSAGE Warning: cannot find "dbase.dep"
+!ENDIF
+!ENDIF
+
+
+!IF "$(CFG)" == "dbase - Win32 Release" || "$(CFG)" == "dbase - Win32 Debug"
+SOURCE=.\functions\dbase.c
+
+"$(INTDIR)\dbase.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\dbase\dbf_head.c
+
+"$(INTDIR)\dbf_head.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\dbase\dbf_misc.c
+
+"$(INTDIR)\dbf_misc.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\dbase\dbf_ndx.c
+
+"$(INTDIR)\dbf_ndx.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\dbase\dbf_rec.c
+
+"$(INTDIR)\dbf_rec.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+
+!ENDIF
+
diff --git a/dbm.mak b/dbm.mak
new file mode 100644
index 0000000..3931f58
--- /dev/null
+++ b/dbm.mak
@@ -0,0 +1,201 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on dbm.dsp
+!IF "$(CFG)" == ""
+CFG=dbm - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to dbm - Win32 Debug.
+!ENDIF
+
+!IF "$(CFG)" != "dbm - Win32 Release" && "$(CFG)" != "dbm - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "dbm.mak" CFG="dbm - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "dbm - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "dbm - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+!IF "$(CFG)" == "dbm - Win32 Release"
+
+OUTDIR=.\module_release
+INTDIR=.\module_release
+# Begin Custom Macros
+OutDir=.\module_release
+# End Custom Macros
+
+ALL : "$(OUTDIR)\php3_dbm.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\db.obj"
+ -@erase "$(INTDIR)\flock.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(OUTDIR)\php3_dbm.dll"
+ -@erase "$(OUTDIR)\php3_dbm.exp"
+ -@erase "$(OUTDIR)\php3_dbm.lib"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MT /W3 /GX /O2 /I "./" /I "../" /I "../../include" /D NDBM=1 /D GDBM=0 /D BSD2=1 /D "NDEBUG" /D "COMPILE_DL" /D "MSVC5" /D "WIN32" /D "_WINDOWS" /Fp"$(INTDIR)\dbm.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\dbm.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=php.lib libdb.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /version:2 /subsystem:windows /dll /incremental:no /pdb:"$(OUTDIR)\php3_dbm.pdb" /machine:I386 /out:"$(OUTDIR)\php3_dbm.dll" /implib:"$(OUTDIR)\php3_dbm.lib" /libpath:"..\..\lib" /libpath:"cgi_release"
+LINK32_OBJS= \
+ "$(INTDIR)\db.obj" \
+ "$(INTDIR)\flock.obj"
+
+"$(OUTDIR)\php3_dbm.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "dbm - Win32 Debug"
+
+OUTDIR=.\module_debug
+INTDIR=.\module_debug
+
+ALL : "c:\php3\php3_dbm.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\db.obj"
+ -@erase "$(INTDIR)\flock.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(OUTDIR)\php3_dbm.exp"
+ -@erase "$(OUTDIR)\php3_dbm.lib"
+ -@erase "$(OUTDIR)\php3_dbm.pdb"
+ -@erase "c:\php3\php3_dbm.dll"
+ -@erase "c:\php3\php3_dbm.ilk"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MTd /W3 /Gm /GX /ZI /Od /I "./" /I "../" /I "../../include" /D NDBM=1 /D GDBM=0 /D BSD2=1 /D "DEBUG" /D "_DEBUG" /D COMPILE_DL=1 /D "MSVC5" /D "WIN32" /D "_WINDOWS" /Fp"$(INTDIR)\dbm.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\dbm.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=php.lib libdb.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /version:2 /subsystem:windows /dll /incremental:yes /pdb:"$(OUTDIR)\php3_dbm.pdb" /debug /machine:I386 /out:"c:\php3/php3_dbm.dll" /implib:"$(OUTDIR)\php3_dbm.lib" /pdbtype:sept /libpath:"..\..\lib" /libpath:"cgi_debug"
+LINK32_OBJS= \
+ "$(INTDIR)\db.obj" \
+ "$(INTDIR)\flock.obj"
+
+"c:\php3\php3_dbm.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF
+
+
+!IF "$(NO_EXTERNAL_DEPS)" != "1"
+!IF EXISTS("dbm.dep")
+!INCLUDE "dbm.dep"
+!ELSE
+!MESSAGE Warning: cannot find "dbm.dep"
+!ENDIF
+!ENDIF
+
+
+!IF "$(CFG)" == "dbm - Win32 Release" || "$(CFG)" == "dbm - Win32 Debug"
+SOURCE=.\functions\db.c
+
+"$(INTDIR)\db.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\win32\flock.c
+
+"$(INTDIR)\flock.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+
+!ENDIF
+
diff --git a/ext/ereg/regex/COPYRIGHT b/ext/ereg/regex/COPYRIGHT
new file mode 100644
index 0000000..d43362f
--- /dev/null
+++ b/ext/ereg/regex/COPYRIGHT
@@ -0,0 +1,20 @@
+Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved.
+This software is not subject to any license of the American Telephone
+and Telegraph Company or of the Regents of the University of California.
+
+Permission is granted to anyone to use this software for any purpose on
+any computer system, and to alter it and redistribute it, subject
+to the following restrictions:
+
+1. The author is not responsible for the consequences of use of this
+ software, no matter how awful, even if they arise from flaws in it.
+
+2. The origin of this software must not be misrepresented, either by
+ explicit claim or by omission. Since few users ever read sources,
+ credits must appear in the documentation.
+
+3. Altered versions must be plainly marked as such, and must not be
+ misrepresented as being the original software. Since few users
+ ever read sources, credits must appear in the documentation.
+
+4. This notice may not be removed or altered.
diff --git a/ext/ereg/regex/Makefile.in b/ext/ereg/regex/Makefile.in
new file mode 100644
index 0000000..2ef89f7
--- /dev/null
+++ b/ext/ereg/regex/Makefile.in
@@ -0,0 +1,141 @@
+SHELL = /bin/sh
+
+srcdir=@srcdir@
+VPATH=@srcdir@
+
+CC=@CC@
+RANLIB=@RANLIB@
+
+# You probably want to take -DREDEBUG out of CFLAGS, and put something like
+# -O in, *after* testing (-DREDEBUG strengthens testing by enabling a lot of
+# internal assertion checking and some debugging facilities).
+# Put -Dconst= in for a pre-ANSI compiler.
+# Do not take -DPOSIX_MISTAKE out.
+# REGCFLAGS isn't important to you (it's for my use in some special contexts).
+CFLAGS=-I$(srcdir) -DPOSIX_MISTAKE @CFLAGS@
+
+# If you have a pre-ANSI compiler, put -o into MKHFLAGS. If you want
+# the Berkeley __P macro, put -b in.
+MKHFLAGS=
+
+# Flags for linking but not compiling, if any.
+LDFLAGS=@LDFLAGS@
+
+# Extra libraries for linking, if any.
+LIBS=
+
+# Internal stuff, should not need changing.
+OBJPRODN=regcomp.o regexec.o regerror.o regfree.o
+OBJS=$(OBJPRODN) split.o debug.o main.o
+H=cclass.h cname.h regex2.h utils.h
+REGSRC=regcomp.c regerror.c regexec.c regfree.c
+ALLSRC=$(REGSRC) engine.c debug.c main.c split.c
+
+# Stuff that matters only if you're trying to lint the package.
+LINTFLAGS=-I. -Dstatic= -Dconst= -DREDEBUG
+LINTC=regcomp.c regexec.c regerror.c regfree.c debug.c main.c
+JUNKLINT=possible pointer alignment|null effect
+
+# arrangements to build forward-reference header files
+.SUFFIXES: .ih .h
+.c.ih:
+ sh $(srcdir)/mkh $(MKHFLAGS) -p $< >$(srcdir)/$@
+
+all lib: libregex.a
+
+libregex.a: $(OBJPRODN)
+ rm -f libregex.a
+ ar cr libregex.a $(OBJPRODN)
+ $(RANLIB) libregex.a
+
+default: r
+
+purge:
+ rm -f *.o
+
+# stuff to build regex.h
+REGEXH=regex.h
+REGEXHSRC=regex2.h $(REGSRC)
+$(REGEXH): $(REGEXHSRC) mkh
+ sh ./mkh $(MKHFLAGS) -i _REGEX_H_ $(REGEXHSRC) >regex.h
+ #cmp -s regex.tmp regex.h 2>/dev/null || cp regex.tmp regex.h
+ #rm -f regex.tmp
+
+# dependencies
+$(OBJPRODN) debug.o: utils.h regex.h regex2.h
+regcomp.o: cclass.h cname.h regcomp.ih
+regexec.o: engine.c engine.ih
+regerror.o: regerror.ih
+debug.o: debug.ih
+main.o: main.ih
+
+# tester
+re: $(OBJS)
+ $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
+
+# regression test
+r: re tests
+ ./re <tests
+ ./re -el <tests
+ ./re -er <tests
+
+# 57 variants, and other stuff, for development use -- not useful to you
+ra: ./re tests
+ -./re <tests
+ -./re -el <tests
+ -./re -er <tests
+
+rx: ./re tests
+ ./re -x <tests
+ ./re -x -el <tests
+ ./re -x -er <tests
+
+t: ./re tests
+ -time ./re <tests
+ -time ./re -cs <tests
+ -time ./re -el <tests
+ -time ./re -cs -el <tests
+
+l: $(LINTC)
+ lint $(LINTFLAGS) -h $(LINTC) 2>&1 | egrep -v '$(JUNKLINT)' | tee lint
+
+fullprint:
+ ti README WHATSNEW notes todo | list
+ ti *.h | list
+ list *.c
+ list regex.3 regex.7
+
+print:
+ ti README WHATSNEW notes todo | list
+ ti *.h | list
+ list reg*.c engine.c
+
+
+mf.tmp: Makefile
+ sed '/^REGEXH=/s/=.*/=regex.h/' Makefile | sed '/#DEL$$/d' >$@
+
+DTRH=cclass.h cname.h regex2.h utils.h
+PRE=COPYRIGHT README WHATSNEW
+POST=mkh regex.3 regex.7 tests $(DTRH) $(ALLSRC) fake/*.[ch]
+FILES=$(PRE) Makefile $(POST)
+DTR=$(PRE) Makefile=mf.tmp $(POST)
+dtr: $(FILES) mf.tmp
+ makedtr $(DTR) >$@
+ rm mf.tmp
+
+cio: $(FILES)
+ cio $(FILES)
+
+rdf: $(FILES)
+ rcsdiff -c $(FILES) 2>&1 | p
+
+# various forms of cleanup
+tidy:
+ rm -f junk* core core.* *.core dtr *.tmp lint
+
+clean: tidy
+ rm -f *.o *.s re libregex.a
+
+# don't do this one unless you know what you're doing
+spotless: clean
+ rm -f mkh regex.h
diff --git a/ext/ereg/regex/README b/ext/ereg/regex/README
new file mode 100644
index 0000000..cea9b67
--- /dev/null
+++ b/ext/ereg/regex/README
@@ -0,0 +1,32 @@
+alpha3.4 release.
+Thu Mar 17 23:17:18 EST 1994
+henry@zoo.toronto.edu
+
+See WHATSNEW for change listing.
+
+installation notes:
+--------
+Read the comments at the beginning of Makefile before running.
+
+Utils.h contains some things that just might have to be modified on
+some systems, as well as a nested include (ugh) of <assert.h>.
+
+The "fake" directory contains quick-and-dirty fakes for some header
+files and routines that old systems may not have. Note also that
+-DUSEBCOPY will make utils.h substitute bcopy() for memmove().
+
+After that, "make r" will build regcomp.o, regexec.o, regfree.o,
+and regerror.o (the actual routines), bundle them together into a test
+program, and run regression tests on them. No output is good output.
+
+"make lib" builds just the .o files for the actual routines (when
+you're happy with testing and have adjusted CFLAGS for production),
+and puts them together into libregex.a. You can pick up either the
+library or *.o ("make lib" makes sure there are no other .o files left
+around to confuse things).
+
+Main.c, debug.c, split.c are used for regression testing but are not part
+of the RE routines themselves.
+
+Regex.h goes in /usr/include. All other .h files are internal only.
+--------
diff --git a/ext/ereg/regex/WHATSNEW b/ext/ereg/regex/WHATSNEW
new file mode 100644
index 0000000..6e82e1d
--- /dev/null
+++ b/ext/ereg/regex/WHATSNEW
@@ -0,0 +1,92 @@
+New in alpha3.4: The complex bug alluded to below has been fixed (in a
+slightly kludgey temporary way that may hurt efficiency a bit; this is
+another "get it out the door for 4.4" release). The tests at the end of
+the tests file have accordingly been uncommented. The primary sign of
+the bug was that something like a?b matching ab matched b rather than ab.
+(The bug was essentially specific to this exact situation, else it would
+have shown up earlier.)
+
+New in alpha3.3: The definition of word boundaries has been altered
+slightly, to more closely match the usual programming notion that "_"
+is an alphabetic. Stuff used for pre-ANSI systems is now in a subdir,
+and the makefile no longer alludes to it in mysterious ways. The
+makefile has generally been cleaned up some. Fixes have been made
+(again!) so that the regression test will run without -DREDEBUG, at
+the cost of weaker checking. A workaround for a bug in some folks'
+<assert.h> has been added. And some more things have been added to
+tests, including a couple right at the end which are commented out
+because the code currently flunks them (complex bug; fix coming).
+Plus the usual minor cleanup.
+
+New in alpha3.2: Assorted bits of cleanup and portability improvement
+(the development base is now a BSDI system using GCC instead of an ancient
+Sun system, and the newer compiler exposed some glitches). Fix for a
+serious bug that affected REs using many [] (including REG_ICASE REs
+because of the way they are implemented), *sometimes*, depending on
+memory-allocation patterns. The header-file prototypes no longer name
+the parameters, avoiding possible name conflicts. The possibility that
+some clot has defined CHAR_MIN as (say) `-128' instead of `(-128)' is
+now handled gracefully. "uchar" is no longer used as an internal type
+name (too many people have the same idea). Still the same old lousy
+performance, alas.
+
+New in alpha3.1: Basically nothing, this release is just a bookkeeping
+convenience. Stay tuned.
+
+New in alpha3.0: Performance is no better, alas, but some fixes have been
+made and some functionality has been added. (This is basically the "get
+it out the door in time for 4.4" release.) One bug fix: regfree() didn't
+free the main internal structure (how embarrassing). It is now possible
+to put NULs in either the RE or the target string, using (resp.) a new
+REG_PEND flag and the old REG_STARTEND flag. The REG_NOSPEC flag to
+regcomp() makes all characters ordinary, so you can match a literal
+string easily (this will become more useful when performance improves!).
+There are now primitives to match beginnings and ends of words, although
+the syntax is disgusting and so is the implementation. The REG_ATOI
+debugging interface has changed a bit. And there has been considerable
+internal cleanup of various kinds.
+
+New in alpha2.3: Split change list out of README, and moved flags notes
+into Makefile. Macro-ized the name of regex(7) in regex(3), since it has
+to change for 4.4BSD. Cleanup work in engine.c, and some new regression
+tests to catch tricky cases thereof.
+
+New in alpha2.2: Out-of-date manpages updated. Regerror() acquires two
+small extensions -- REG_ITOA and REG_ATOI -- which avoid debugging kludges
+in my own test program and might be useful to others for similar purposes.
+The regression test will now compile (and run) without REDEBUG. The
+BRE \$ bug is fixed. Most uses of "uchar" are gone; it's all chars now.
+Char/uchar parameters are now written int/unsigned, to avoid possible
+portability problems with unpromoted parameters. Some unsigned casts have
+been introduced to minimize portability problems with shifting into sign
+bits.
+
+New in alpha2.1: Lots of little stuff, cleanup and fixes. The one big
+thing is that regex.h is now generated, using mkh, rather than being
+supplied in the distribution; due to circularities in dependencies,
+you have to build regex.h explicitly by "make h". The two known bugs
+have been fixed (and the regression test now checks for them), as has a
+problem with assertions not being suppressed in the absence of REDEBUG.
+No performance work yet.
+
+New in alpha2: Backslash-anything is an ordinary character, not an
+error (except, of course, for the handful of backslashed metacharacters
+in BREs), which should reduce script breakage. The regression test
+checks *where* null strings are supposed to match, and has generally
+been tightened up somewhat. Small bug fixes in parameter passing (not
+harmful, but technically errors) and some other areas. Debugging
+invoked by defining REDEBUG rather than not defining NDEBUG.
+
+New in alpha+3: full prototyping for internal routines, using a little
+helper program, mkh, which extracts prototypes given in stylized comments.
+More minor cleanup. Buglet fix: it's CHAR_BIT, not CHAR_BITS. Simple
+pre-screening of input when a literal string is known to be part of the
+RE; this does wonders for performance.
+
+New in alpha+2: minor bits of cleanup. Notably, the number "32" for the
+word width isn't hardwired into regexec.c any more, the public header
+file prototypes the functions if __STDC__ is defined, and some small typos
+in the manpages have been fixed.
+
+New in alpha+1: improvements to the manual pages, and an important
+extension, the REG_STARTEND option to regexec().
diff --git a/ext/ereg/regex/cclass.h b/ext/ereg/regex/cclass.h
new file mode 100644
index 0000000..727cbb9
--- /dev/null
+++ b/ext/ereg/regex/cclass.h
@@ -0,0 +1,31 @@
+/* character-class table */
+static struct cclass {
+ char *name;
+ char *chars;
+ char *multis;
+} cclasses[] = {
+ { "alnum", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
+0123456789", "" },
+ { "alpha", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
+ "" },
+ { "blank", " \t", "" },
+ { "cntrl", "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\
+\25\26\27\30\31\32\33\34\35\36\37\177", "" },
+ { "digit", "0123456789", "" },
+ { "graph", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
+0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
+ "" },
+ { "lower", "abcdefghijklmnopqrstuvwxyz",
+ "" },
+ { "print", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
+0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ",
+ "" },
+ { "punct", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
+ "" },
+ { "space", "\t\n\v\f\r ", "" },
+ { "upper", "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ "" },
+ { "xdigit", "0123456789ABCDEFabcdef",
+ "" },
+ { NULL, 0, "" }
+};
diff --git a/ext/ereg/regex/cname.h b/ext/ereg/regex/cname.h
new file mode 100644
index 0000000..ff116e5
--- /dev/null
+++ b/ext/ereg/regex/cname.h
@@ -0,0 +1,102 @@
+/* character-name table */
+static struct cname {
+ char *name;
+ char code;
+} cnames[] = {
+ { "NUL", '\0' },
+ { "SOH", '\001' },
+ { "STX", '\002' },
+ { "ETX", '\003' },
+ { "EOT", '\004' },
+ { "ENQ", '\005' },
+ { "ACK", '\006' },
+ { "BEL", '\007' },
+ { "alert", '\007' },
+ { "BS", '\010' },
+ { "backspace", '\b' },
+ { "HT", '\011' },
+ { "tab", '\t' },
+ { "LF", '\012' },
+ { "newline", '\n' },
+ { "VT", '\013' },
+ { "vertical-tab", '\v' },
+ { "FF", '\014' },
+ { "form-feed", '\f' },
+ { "CR", '\015' },
+ { "carriage-return", '\r' },
+ { "SO", '\016' },
+ { "SI", '\017' },
+ { "DLE", '\020' },
+ { "DC1", '\021' },
+ { "DC2", '\022' },
+ { "DC3", '\023' },
+ { "DC4", '\024' },
+ { "NAK", '\025' },
+ { "SYN", '\026' },
+ { "ETB", '\027' },
+ { "CAN", '\030' },
+ { "EM", '\031' },
+ { "SUB", '\032' },
+ { "ESC", '\033' },
+ { "IS4", '\034' },
+ { "FS", '\034' },
+ { "IS3", '\035' },
+ { "GS", '\035' },
+ { "IS2", '\036' },
+ { "RS", '\036' },
+ { "IS1", '\037' },
+ { "US", '\037' },
+ { "space", ' ' },
+ { "exclamation-mark", '!' },
+ { "quotation-mark", '"' },
+ { "number-sign", '#' },
+ { "dollar-sign", '$' },
+ { "percent-sign", '%' },
+ { "ampersand", '&' },
+ { "apostrophe", '\'' },
+ { "left-parenthesis", '(' },
+ { "right-parenthesis", ')' },
+ { "asterisk", '*' },
+ { "plus-sign", '+' },
+ { "comma", ',' },
+ { "hyphen", '-' },
+ { "hyphen-minus", '-' },
+ { "period", '.' },
+ { "full-stop", '.' },
+ { "slash", '/' },
+ { "solidus", '/' },
+ { "zero", '0' },
+ { "one", '1' },
+ { "two", '2' },
+ { "three", '3' },
+ { "four", '4' },
+ { "five", '5' },
+ { "six", '6' },
+ { "seven", '7' },
+ { "eight", '8' },
+ { "nine", '9' },
+ { "colon", ':' },
+ { "semicolon", ';' },
+ { "less-than-sign", '<' },
+ { "equals-sign", '=' },
+ { "greater-than-sign", '>' },
+ { "question-mark", '?' },
+ { "commercial-at", '@' },
+ { "left-square-bracket", '[' },
+ { "backslash", '\\' },
+ { "reverse-solidus", '\\' },
+ { "right-square-bracket", ']' },
+ { "circumflex", '^' },
+ { "circumflex-accent", '^' },
+ { "underscore", '_' },
+ { "low-line", '_' },
+ { "grave-accent", '`' },
+ { "left-brace", '{' },
+ { "left-curly-bracket", '{' },
+ { "vertical-line", '|' },
+ { "right-brace", '}' },
+ { "right-curly-bracket", '}' },
+ { "tilde", '~' },
+ { "DEL", '\177' },
+ { NULL, 0 }
+};
diff --git a/ext/ereg/regex/debug.c b/ext/ereg/regex/debug.c
new file mode 100644
index 0000000..c0feaeb
--- /dev/null
+++ b/ext/ereg/regex/debug.c
@@ -0,0 +1,242 @@
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regex2.h"
+#include "debug.ih"
+
+/*
+ - regprint - print a regexp for debugging
+ == void regprint(regex_t *r, FILE *d);
+ */
+void
+regprint(r, d)
+regex_t *r;
+FILE *d;
+{
+ register struct re_guts *g = r->re_g;
+ register int i;
+ register int c;
+ register int last;
+ int nincat[NC];
+
+ fprintf(d, "%ld states, %d categories", (long)g->nstates,
+ g->ncategories);
+ fprintf(d, ", first %ld last %ld", (long)g->firststate,
+ (long)g->laststate);
+ if (g->iflags&USEBOL)
+ fprintf(d, ", USEBOL");
+ if (g->iflags&USEEOL)
+ fprintf(d, ", USEEOL");
+ if (g->iflags&BAD)
+ fprintf(d, ", BAD");
+ if (g->nsub > 0)
+ fprintf(d, ", nsub=%ld", (long)g->nsub);
+ if (g->must != NULL)
+ fprintf(d, ", must(%ld) `%*s'", (long)g->mlen, (int)g->mlen,
+ g->must);
+ if (g->backrefs)
+ fprintf(d, ", backrefs");
+ if (g->nplus > 0)
+ fprintf(d, ", nplus %ld", (long)g->nplus);
+ fprintf(d, "\n");
+ s_print(g, d);
+ for (i = 0; i < g->ncategories; i++) {
+ nincat[i] = 0;
+ for (c = CHAR_MIN; c <= CHAR_MAX; c++)
+ if (g->categories[c] == i)
+ nincat[i]++;
+ }
+ fprintf(d, "cc0#%d", nincat[0]);
+ for (i = 1; i < g->ncategories; i++)
+ if (nincat[i] == 1) {
+ for (c = CHAR_MIN; c <= CHAR_MAX; c++)
+ if (g->categories[c] == i)
+ break;
+ fprintf(d, ", %d=%s", i, regchar(c));
+ }
+ fprintf(d, "\n");
+ for (i = 1; i < g->ncategories; i++)
+ if (nincat[i] != 1) {
+ fprintf(d, "cc%d\t", i);
+ last = -1;
+ for (c = CHAR_MIN; c <= CHAR_MAX+1; c++) /* +1 does flush */
+ if (c <= CHAR_MAX && g->categories[c] == i) {
+ if (last < 0) {
+ fprintf(d, "%s", regchar(c));
+ last = c;
+ }
+ } else {
+ if (last >= 0) {
+ if (last != c-1)
+ fprintf(d, "-%s",
+ regchar(c-1));
+ last = -1;
+ }
+ }
+ fprintf(d, "\n");
+ }
+}
+
+/*
+ - s_print - print the strip for debugging
+ == static void s_print(register struct re_guts *g, FILE *d);
+ */
+static void
+s_print(g, d)
+register struct re_guts *g;
+FILE *d;
+{
+ register sop *s;
+ register cset *cs;
+ register int i;
+ register int done = 0;
+ register sop opnd;
+ register int col = 0;
+ register int last;
+ register sopno offset = 2;
+# define GAP() { if (offset % 5 == 0) { \
+ if (col > 40) { \
+ fprintf(d, "\n\t"); \
+ col = 0; \
+ } else { \
+ fprintf(d, " "); \
+ col++; \
+ } \
+ } else \
+ col++; \
+ offset++; \
+ }
+
+ if (OP(g->strip[0]) != OEND)
+ fprintf(d, "missing initial OEND!\n");
+ for (s = &g->strip[1]; !done; s++) {
+ opnd = OPND(*s);
+ switch (OP(*s)) {
+ case OEND:
+ fprintf(d, "\n");
+ done = 1;
+ break;
+ case OCHAR:
+ if (strchr("\\|()^$.[+*?{}!<> ", (char)opnd) != NULL)
+ fprintf(d, "\\%c", (char)opnd);
+ else
+ fprintf(d, "%s", regchar((char)opnd));
+ break;
+ case OBOL:
+ fprintf(d, "^");
+ break;
+ case OEOL:
+ fprintf(d, "$");
+ break;
+ case OBOW:
+ fprintf(d, "\\{");
+ break;
+ case OEOW:
+ fprintf(d, "\\}");
+ break;
+ case OANY:
+ fprintf(d, ".");
+ break;
+ case OANYOF:
+ fprintf(d, "[(%ld)", (long)opnd);
+ cs = &g->sets[opnd];
+ last = -1;
+ for (i = 0; i < g->csetsize+1; i++) /* +1 flushes */
+ if (CHIN(cs, i) && i < g->csetsize) {
+ if (last < 0) {
+ fprintf(d, "%s", regchar(i));
+ last = i;
+ }
+ } else {
+ if (last >= 0) {
+ if (last != i-1)
+ fprintf(d, "-%s",
+ regchar(i-1));
+ last = -1;
+ }
+ }
+ fprintf(d, "]");
+ break;
+ case OBACK_:
+ fprintf(d, "(\\<%ld>", (long)opnd);
+ break;
+ case O_BACK:
+ fprintf(d, "<%ld>\\)", (long)opnd);
+ break;
+ case OPLUS_:
+ fprintf(d, "(+");
+ if (OP(*(s+opnd)) != O_PLUS)
+ fprintf(d, "<%ld>", (long)opnd);
+ break;
+ case O_PLUS:
+ if (OP(*(s-opnd)) != OPLUS_)
+ fprintf(d, "<%ld>", (long)opnd);
+ fprintf(d, "+)");
+ break;
+ case OQUEST_:
+ fprintf(d, "(?");
+ if (OP(*(s+opnd)) != O_QUEST)
+ fprintf(d, "<%ld>", (long)opnd);
+ break;
+ case O_QUEST:
+ if (OP(*(s-opnd)) != OQUEST_)
+ fprintf(d, "<%ld>", (long)opnd);
+ fprintf(d, "?)");
+ break;
+ case OLPAREN:
+ fprintf(d, "((<%ld>", (long)opnd);
+ break;
+ case ORPAREN:
+ fprintf(d, "<%ld>))", (long)opnd);
+ break;
+ case OCH_:
+ fprintf(d, "<");
+ if (OP(*(s+opnd)) != OOR2)
+ fprintf(d, "<%ld>", (long)opnd);
+ break;
+ case OOR1:
+ if (OP(*(s-opnd)) != OOR1 && OP(*(s-opnd)) != OCH_)
+ fprintf(d, "<%ld>", (long)opnd);
+ fprintf(d, "|");
+ break;
+ case OOR2:
+ fprintf(d, "|");
+ if (OP(*(s+opnd)) != OOR2 && OP(*(s+opnd)) != O_CH)
+ fprintf(d, "<%ld>", (long)opnd);
+ break;
+ case O_CH:
+ if (OP(*(s-opnd)) != OOR1)
+ fprintf(d, "<%ld>", (long)opnd);
+ fprintf(d, ">");
+ break;
+ default:
+ fprintf(d, "!%ld(%ld)!", OP(*s), opnd);
+ break;
+ }
+ if (!done)
+ GAP();
+ }
+}
+
+/*
+ - regchar - make a character printable
+ == static char *regchar(int ch);
+ */
+static char * /* -> representation */
+regchar(ch)
+int ch;
+{
+ static char buf[10];
+
+ if (isprint(ch) || ch == ' ')
+ sprintf(buf, "%c", ch);
+ else
+ sprintf(buf, "\\%o", ch);
+ return(buf);
+}
diff --git a/ext/ereg/regex/engine.c b/ext/ereg/regex/engine.c
new file mode 100644
index 0000000..696774e
--- /dev/null
+++ b/ext/ereg/regex/engine.c
@@ -0,0 +1,1019 @@
+/*
+ * The matching engine and friends. This file is #included by regexec.c
+ * after suitable #defines of a variety of macros used herein, so that
+ * different state representations can be used without duplicating masses
+ * of code.
+ */
+
+#ifdef SNAMES
+#define matcher smatcher
+#define fast sfast
+#define slow sslow
+#define dissect sdissect
+#define backref sbackref
+#define step sstep
+#define print sprint
+#define at sat
+#define match smat
+#endif
+#ifdef LNAMES
+#define matcher lmatcher
+#define fast lfast
+#define slow lslow
+#define dissect ldissect
+#define backref lbackref
+#define step lstep
+#define print lprint
+#define at lat
+#define match lmat
+#endif
+
+/* another structure passed up and down to avoid zillions of parameters */
+struct match {
+ struct re_guts *g;
+ int eflags;
+ regmatch_t *pmatch; /* [nsub+1] (0 element unused) */
+ char *offp; /* offsets work from here */
+ char *beginp; /* start of string -- virtual NUL precedes */
+ char *endp; /* end of string -- virtual NUL here */
+ char *coldp; /* can be no match starting before here */
+ char **lastpos; /* [nplus+1] */
+ STATEVARS;
+ states st; /* current states */
+ states fresh; /* states for a fresh start */
+ states tmp; /* temporary */
+ states empty; /* empty set of states */
+};
+
+#include "engine.ih"
+
+#ifdef REDEBUG
+#define SP(t, s, c) print(m, t, s, c, stdout)
+#define AT(t, p1, p2, s1, s2) at(m, t, p1, p2, s1, s2)
+#define NOTE(str) { if (m->eflags&REG_TRACE) printf("=%s\n", (str)); }
+#else
+#define SP(t, s, c) /* nothing */
+#define AT(t, p1, p2, s1, s2) /* nothing */
+#define NOTE(s) /* nothing */
+#endif
+
+/*
+ - matcher - the actual matching engine
+ == static int matcher(register struct re_guts *g, char *string, \
+ == size_t nmatch, regmatch_t pmatch[], int eflags);
+ */
+static int /* 0 success, REG_NOMATCH failure */
+matcher(g, string, nmatch, pmatch, eflags)
+register struct re_guts *g;
+char *string;
+size_t nmatch;
+regmatch_t pmatch[];
+int eflags;
+{
+ register char *endp;
+ register unsigned int i;
+ struct match mv;
+ register struct match *m = &mv;
+ register char *dp;
+ register const sopno gf = g->firststate+1; /* +1 for OEND */
+ register const sopno gl = g->laststate;
+ char *start;
+ char *stop;
+
+ /* simplify the situation where possible */
+ if (g->cflags&REG_NOSUB)
+ nmatch = 0;
+ if (eflags&REG_STARTEND) {
+ start = string + pmatch[0].rm_so;
+ stop = string + pmatch[0].rm_eo;
+ } else {
+ start = string;
+ stop = start + strlen(start);
+ }
+ if (stop < start)
+ return(REG_INVARG);
+
+ /* prescreening; this does wonders for this rather slow code */
+ if (g->must != NULL) {
+ for (dp = start; dp < stop; dp++)
+ if (*dp == g->must[0] && stop - dp >= g->mlen &&
+ memcmp(dp, g->must, (size_t)g->mlen) == 0)
+ break;
+ if (dp == stop) /* we didn't find g->must */
+ return(REG_NOMATCH);
+ }
+
+ /* match struct setup */
+ m->g = g;
+ m->eflags = eflags;
+ m->pmatch = NULL;
+ m->lastpos = NULL;
+ m->offp = string;
+ m->beginp = start;
+ m->endp = stop;
+ STATESETUP(m, 4);
+ SETUP(m->st);
+ SETUP(m->fresh);
+ SETUP(m->tmp);
+ SETUP(m->empty);
+ CLEAR(m->empty);
+
+ /* this loop does only one repetition except for backrefs */
+ for (;;) {
+ endp = fast(m, start, stop, gf, gl);
+ if (endp == NULL) { /* a miss */
+ STATETEARDOWN(m);
+ return(REG_NOMATCH);
+ }
+ if (nmatch == 0 && !g->backrefs)
+ break; /* no further info needed */
+
+ /* where? */
+ assert(m->coldp != NULL);
+ for (;;) {
+ NOTE("finding start");
+ endp = slow(m, m->coldp, stop, gf, gl);
+ if (endp != NULL)
+ break;
+ assert(m->coldp < m->endp);
+ m->coldp++;
+ }
+ if (nmatch == 1 && !g->backrefs)
+ break; /* no further info needed */
+
+ /* oh my, he wants the subexpressions... */
+ if (m->pmatch == NULL)
+ m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) *
+ sizeof(regmatch_t));
+ if (m->pmatch == NULL) {
+ STATETEARDOWN(m);
+ return(REG_ESPACE);
+ }
+ for (i = 1; i <= m->g->nsub; i++)
+ m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1;
+ if (!g->backrefs && !(m->eflags&REG_BACKR)) {
+ NOTE("dissecting");
+ dp = dissect(m, m->coldp, endp, gf, gl);
+ } else {
+ if (g->nplus > 0 && m->lastpos == NULL)
+ m->lastpos = (char **)malloc((g->nplus+1) *
+ sizeof(char *));
+ if (g->nplus > 0 && m->lastpos == NULL) {
+ free(m->pmatch);
+ STATETEARDOWN(m);
+ return(REG_ESPACE);
+ }
+ NOTE("backref dissect");
+ dp = backref(m, m->coldp, endp, gf, gl, (sopno)0);
+ }
+ if (dp != NULL)
+ break;
+
+ /* uh-oh... we couldn't find a subexpression-level match */
+ assert(g->backrefs); /* must be back references doing it */
+ assert(g->nplus == 0 || m->lastpos != NULL);
+ for (;;) {
+ if (dp != NULL || endp <= m->coldp)
+ break; /* defeat */
+ NOTE("backoff");
+ endp = slow(m, m->coldp, endp-1, gf, gl);
+ if (endp == NULL)
+ break; /* defeat */
+ /* try it on a shorter possibility */
+#ifndef NDEBUG
+ for (i = 1; i <= m->g->nsub; i++) {
+ assert(m->pmatch[i].rm_so == -1);
+ assert(m->pmatch[i].rm_eo == -1);
+ }
+#endif
+ NOTE("backoff dissect");
+ dp = backref(m, m->coldp, endp, gf, gl, (sopno)0);
+ }
+ assert(dp == NULL || dp == endp);
+ if (dp != NULL) /* found a shorter one */
+ break;
+
+ /* despite initial appearances, there is no match here */
+ NOTE("false alarm");
+ start = m->coldp + 1; /* recycle starting later */
+ assert(start <= stop);
+ }
+
+ /* fill in the details if requested */
+ if (nmatch > 0) {
+ pmatch[0].rm_so = m->coldp - m->offp;
+ pmatch[0].rm_eo = endp - m->offp;
+ }
+ if (nmatch > 1) {
+ assert(m->pmatch != NULL);
+ for (i = 1; i < nmatch; i++)
+ if (i <= m->g->nsub)
+ pmatch[i] = m->pmatch[i];
+ else {
+ pmatch[i].rm_so = -1;
+ pmatch[i].rm_eo = -1;
+ }
+ }
+
+ if (m->pmatch != NULL)
+ free((char *)m->pmatch);
+ if (m->lastpos != NULL)
+ free((char *)m->lastpos);
+ STATETEARDOWN(m);
+ return(0);
+}
+
+/*
+ - dissect - figure out what matched what, no back references
+ == static char *dissect(register struct match *m, char *start, \
+ == char *stop, sopno startst, sopno stopst);
+ */
+static char * /* == stop (success) always */
+dissect(m, start, stop, startst, stopst)
+register struct match *m;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+{
+ register int i;
+ register sopno ss; /* start sop of current subRE */
+ register sopno es; /* end sop of current subRE */
+ register char *sp; /* start of string matched by it */
+ register char *stp; /* string matched by it cannot pass here */
+ register char *rest; /* start of rest of string */
+ register char *tail; /* string unmatched by rest of RE */
+ register sopno ssub; /* start sop of subsubRE */
+ register sopno esub; /* end sop of subsubRE */
+ register char *ssp; /* start of string matched by subsubRE */
+ register char *sep; /* end of string matched by subsubRE */
+ register char *oldssp; /* previous ssp */
+ register char *dp;
+
+ AT("diss", start, stop, startst, stopst);
+ sp = start;
+ for (ss = startst; ss < stopst; ss = es) {
+ /* identify end of subRE */
+ es = ss;
+ switch (OP(m->g->strip[es])) {
+ case OPLUS_:
+ case OQUEST_:
+ es += OPND(m->g->strip[es]);
+ break;
+ case OCH_:
+ while (OP(m->g->strip[es]) != O_CH)
+ es += OPND(m->g->strip[es]);
+ break;
+ }
+ es++;
+
+ /* figure out what it matched */
+ switch (OP(m->g->strip[ss])) {
+ case OEND:
+ assert(nope);
+ break;
+ case OCHAR:
+ sp++;
+ break;
+ case OBOL:
+ case OEOL:
+ case OBOW:
+ case OEOW:
+ break;
+ case OANY:
+ case OANYOF:
+ sp++;
+ break;
+ case OBACK_:
+ case O_BACK:
+ assert(nope);
+ break;
+ /* cases where length of match is hard to find */
+ case OQUEST_:
+ stp = stop;
+ for (;;) {
+ /* how long could this one be? */
+ rest = slow(m, sp, stp, ss, es);
+ assert(rest != NULL); /* it did match */
+ /* could the rest match the rest? */
+ tail = slow(m, rest, stop, es, stopst);
+ if (tail == stop)
+ break; /* yes! */
+ /* no -- try a shorter match for this one */
+ stp = rest - 1;
+ assert(stp >= sp); /* it did work */
+ }
+ ssub = ss + 1;
+ esub = es - 1;
+ /* did innards match? */
+ if (slow(m, sp, rest, ssub, esub) != NULL) {
+ dp = dissect(m, sp, rest, ssub, esub);
+ assert(dp == rest);
+ } else /* no */
+ assert(sp == rest);
+ sp = rest;
+ break;
+ case OPLUS_:
+ stp = stop;
+ for (;;) {
+ /* how long could this one be? */
+ rest = slow(m, sp, stp, ss, es);
+ assert(rest != NULL); /* it did match */
+ /* could the rest match the rest? */
+ tail = slow(m, rest, stop, es, stopst);
+ if (tail == stop)
+ break; /* yes! */
+ /* no -- try a shorter match for this one */
+ stp = rest - 1;
+ assert(stp >= sp); /* it did work */
+ }
+ ssub = ss + 1;
+ esub = es - 1;
+ ssp = sp;
+ oldssp = ssp;
+ for (;;) { /* find last match of innards */
+ sep = slow(m, ssp, rest, ssub, esub);
+ if (sep == NULL || sep == ssp)
+ break; /* failed or matched null */
+ oldssp = ssp; /* on to next try */
+ ssp = sep;
+ }
+ if (sep == NULL) {
+ /* last successful match */
+ sep = ssp;
+ ssp = oldssp;
+ }
+ assert(sep == rest); /* must exhaust substring */
+ assert(slow(m, ssp, sep, ssub, esub) == rest);
+ dp = dissect(m, ssp, sep, ssub, esub);
+ assert(dp == sep);
+ sp = rest;
+ break;
+ case OCH_:
+ stp = stop;
+ for (;;) {
+ /* how long could this one be? */
+ rest = slow(m, sp, stp, ss, es);
+ assert(rest != NULL); /* it did match */
+ /* could the rest match the rest? */
+ tail = slow(m, rest, stop, es, stopst);
+ if (tail == stop)
+ break; /* yes! */
+ /* no -- try a shorter match for this one */
+ stp = rest - 1;
+ assert(stp >= sp); /* it did work */
+ }
+ ssub = ss + 1;
+ esub = ss + OPND(m->g->strip[ss]) - 1;
+ assert(OP(m->g->strip[esub]) == OOR1);
+ for (;;) { /* find first matching branch */
+ if (slow(m, sp, rest, ssub, esub) == rest)
+ break; /* it matched all of it */
+ /* that one missed, try next one */
+ assert(OP(m->g->strip[esub]) == OOR1);
+ esub++;
+ assert(OP(m->g->strip[esub]) == OOR2);
+ ssub = esub + 1;
+ esub += OPND(m->g->strip[esub]);
+ if (OP(m->g->strip[esub]) == OOR2)
+ esub--;
+ else
+ assert(OP(m->g->strip[esub]) == O_CH);
+ }
+ dp = dissect(m, sp, rest, ssub, esub);
+ assert(dp == rest);
+ sp = rest;
+ break;
+ case O_PLUS:
+ case O_QUEST:
+ case OOR1:
+ case OOR2:
+ case O_CH:
+ assert(nope);
+ break;
+ case OLPAREN:
+ i = OPND(m->g->strip[ss]);
+ assert(0 < i && i <= m->g->nsub);
+ m->pmatch[i].rm_so = sp - m->offp;
+ break;
+ case ORPAREN:
+ i = OPND(m->g->strip[ss]);
+ assert(0 < i && i <= m->g->nsub);
+ m->pmatch[i].rm_eo = sp - m->offp;
+ break;
+ default: /* uh oh */
+ assert(nope);
+ break;
+ }
+ }
+
+ assert(sp == stop);
+ return(sp);
+}
+
+/*
+ - backref - figure out what matched what, figuring in back references
+ == static char *backref(register struct match *m, char *start, \
+ == char *stop, sopno startst, sopno stopst, sopno lev);
+ */
+static char * /* == stop (success) or NULL (failure) */
+backref(m, start, stop, startst, stopst, lev)
+register struct match *m;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+sopno lev; /* PLUS nesting level */
+{
+ register int i;
+ register sopno ss; /* start sop of current subRE */
+ register char *sp; /* start of string matched by it */
+ register sopno ssub; /* start sop of subsubRE */
+ register sopno esub; /* end sop of subsubRE */
+ register char *ssp; /* start of string matched by subsubRE */
+ register char *dp;
+ register size_t len;
+ register int hard;
+ register sop s;
+ register regoff_t offsave;
+ register cset *cs;
+
+ AT("back", start, stop, startst, stopst);
+ sp = start;
+
+ /* get as far as we can with easy stuff */
+ hard = 0;
+ for (ss = startst; !hard && ss < stopst; ss++)
+ switch (OP(s = m->g->strip[ss])) {
+ case OCHAR:
+ if (sp == stop || *sp++ != (char)OPND(s))
+ return(NULL);
+ break;
+ case OANY:
+ if (sp == stop)
+ return(NULL);
+ sp++;
+ break;
+ case OANYOF:
+ cs = &m->g->sets[OPND(s)];
+ if (sp == stop || !CHIN(cs, *sp++))
+ return(NULL);
+ break;
+ case OBOL:
+ if ( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
+ (sp < m->endp && *(sp-1) == '\n' &&
+ (m->g->cflags&REG_NEWLINE)) )
+ { /* yes */ }
+ else
+ return(NULL);
+ break;
+ case OEOL:
+ if ( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||
+ (sp < m->endp && *sp == '\n' &&
+ (m->g->cflags&REG_NEWLINE)) )
+ { /* yes */ }
+ else
+ return(NULL);
+ break;
+ case OBOW:
+ if (( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
+ (sp < m->endp && *(sp-1) == '\n' &&
+ (m->g->cflags&REG_NEWLINE)) ||
+ (sp > m->beginp &&
+ !ISWORD(*(sp-1))) ) &&
+ (sp < m->endp && ISWORD(*sp)) )
+ { /* yes */ }
+ else
+ return(NULL);
+ break;
+ case OEOW:
+ if (( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||
+ (sp < m->endp && *sp == '\n' &&
+ (m->g->cflags&REG_NEWLINE)) ||
+ (sp < m->endp && !ISWORD(*sp)) ) &&
+ (sp > m->beginp && ISWORD(*(sp-1))) )
+ { /* yes */ }
+ else
+ return(NULL);
+ break;
+ case O_QUEST:
+ break;
+ case OOR1: /* matches null but needs to skip */
+ ss++;
+ s = m->g->strip[ss];
+ do {
+ assert(OP(s) == OOR2);
+ ss += OPND(s);
+ } while (OP(s = m->g->strip[ss]) != O_CH);
+ /* note that the ss++ gets us past the O_CH */
+ break;
+ default: /* have to make a choice */
+ hard = 1;
+ break;
+ }
+ if (!hard) { /* that was it! */
+ if (sp != stop)
+ return(NULL);
+ return(sp);
+ }
+ ss--; /* adjust for the for's final increment */
+
+ /* the hard stuff */
+ AT("hard", sp, stop, ss, stopst);
+ s = m->g->strip[ss];
+ switch (OP(s)) {
+ case OBACK_: /* the vilest depths */
+ i = OPND(s);
+ assert(0 < i && i <= m->g->nsub);
+ if (m->pmatch[i].rm_eo == -1)
+ return(NULL);
+ assert(m->pmatch[i].rm_so != -1);
+ len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so;
+ assert(stop - m->beginp >= len);
+ if (sp > stop - len)
+ return(NULL); /* not enough left to match */
+ ssp = m->offp + m->pmatch[i].rm_so;
+ if (memcmp(sp, ssp, len) != 0)
+ return(NULL);
+ while (m->g->strip[ss] != SOP(O_BACK, i))
+ ss++;
+ return(backref(m, sp+len, stop, ss+1, stopst, lev));
+ break;
+ case OQUEST_: /* to null or not */
+ dp = backref(m, sp, stop, ss+1, stopst, lev);
+ if (dp != NULL)
+ return(dp); /* not */
+ return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev));
+ break;
+ case OPLUS_:
+ assert(m->lastpos != NULL);
+ assert(lev+1 <= m->g->nplus);
+ m->lastpos[lev+1] = sp;
+ return(backref(m, sp, stop, ss+1, stopst, lev+1));
+ break;
+ case O_PLUS:
+ if (sp == m->lastpos[lev]) /* last pass matched null */
+ return(backref(m, sp, stop, ss+1, stopst, lev-1));
+ /* try another pass */
+ m->lastpos[lev] = sp;
+ dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev);
+ if (dp == NULL)
+ return(backref(m, sp, stop, ss+1, stopst, lev-1));
+ else
+ return(dp);
+ break;
+ case OCH_: /* find the right one, if any */
+ ssub = ss + 1;
+ esub = ss + OPND(s) - 1;
+ assert(OP(m->g->strip[esub]) == OOR1);
+ for (;;) { /* find first matching branch */
+ dp = backref(m, sp, stop, ssub, esub, lev);
+ if (dp != NULL)
+ return(dp);
+ /* that one missed, try next one */
+ if (OP(m->g->strip[esub]) == O_CH)
+ return(NULL); /* there is none */
+ esub++;
+ assert(OP(m->g->strip[esub]) == OOR2);
+ ssub = esub + 1;
+ esub += OPND(m->g->strip[esub]);
+ if (OP(m->g->strip[esub]) == OOR2)
+ esub--;
+ else
+ assert(OP(m->g->strip[esub]) == O_CH);
+ }
+ break;
+ case OLPAREN: /* must undo assignment if rest fails */
+ i = OPND(s);
+ assert(0 < i && i <= m->g->nsub);
+ offsave = m->pmatch[i].rm_so;
+ m->pmatch[i].rm_so = sp - m->offp;
+ dp = backref(m, sp, stop, ss+1, stopst, lev);
+ if (dp != NULL)
+ return(dp);
+ m->pmatch[i].rm_so = offsave;
+ return(NULL);
+ break;
+ case ORPAREN: /* must undo assignment if rest fails */
+ i = OPND(s);
+ assert(0 < i && i <= m->g->nsub);
+ offsave = m->pmatch[i].rm_eo;
+ m->pmatch[i].rm_eo = sp - m->offp;
+ dp = backref(m, sp, stop, ss+1, stopst, lev);
+ if (dp != NULL)
+ return(dp);
+ m->pmatch[i].rm_eo = offsave;
+ return(NULL);
+ break;
+ default: /* uh oh */
+ assert(nope);
+ break;
+ }
+
+ /* "can't happen" */
+ assert(nope);
+ /* NOTREACHED */
+ return( NULL );
+}
+
+/*
+ - fast - step through the string at top speed
+ == static char *fast(register struct match *m, char *start, \
+ == char *stop, sopno startst, sopno stopst);
+ */
+static char * /* where tentative match ended, or NULL */
+fast(m, start, stop, startst, stopst)
+register struct match *m;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+{
+ register states st = m->st;
+ register states fresh = m->fresh;
+ register states tmp = m->tmp;
+ register char *p = start;
+ register int c = (start == m->beginp) ? OUT : *(start-1);
+ register int lastc; /* previous c */
+ register int flagch;
+ register int i;
+ register char *coldp; /* last p after which no match was underway */
+
+ CLEAR(st);
+ SET1(st, startst);
+ st = step(m->g, startst, stopst, st, NOTHING, st);
+ ASSIGN(fresh, st);
+ SP("start", st, *p);
+ coldp = NULL;
+ for (;;) {
+ /* next character */
+ lastc = c;
+ c = (p == m->endp) ? OUT : *p;
+ if (EQ(st, fresh))
+ coldp = p;
+
+ /* is there an EOL and/or BOL between lastc and c? */
+ flagch = '\0';
+ i = 0;
+ if ( (lastc == '\n' && m->g->cflags&REG_NEWLINE) ||
+ (lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
+ flagch = BOL;
+ i = m->g->nbol;
+ }
+ if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
+ (c == OUT && !(m->eflags&REG_NOTEOL)) ) {
+ flagch = (flagch == BOL) ? BOLEOL : EOL;
+ i += m->g->neol;
+ }
+ if (i != 0) {
+ for (; i > 0; i--)
+ st = step(m->g, startst, stopst, st, flagch, st);
+ SP("boleol", st, c);
+ }
+
+ /* how about a word boundary? */
+ if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) &&
+ (c != OUT && ISWORD(c)) ) {
+ flagch = BOW;
+ }
+ if ( (lastc != OUT && ISWORD(lastc)) &&
+ (flagch == EOL || (c != OUT && !ISWORD(c))) ) {
+ flagch = EOW;
+ }
+ if (flagch == BOW || flagch == EOW) {
+ st = step(m->g, startst, stopst, st, flagch, st);
+ SP("boweow", st, c);
+ }
+
+ /* are we done? */
+ if (ISSET(st, stopst) || p == stop)
+ break; /* NOTE BREAK OUT */
+
+ /* no, we must deal with this character */
+ ASSIGN(tmp, st);
+ ASSIGN(st, fresh);
+ assert(c != OUT);
+ st = step(m->g, startst, stopst, tmp, c, st);
+ SP("aft", st, c);
+ assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
+ p++;
+ }
+
+ assert(coldp != NULL);
+ m->coldp = coldp;
+ if (ISSET(st, stopst))
+ return(p+1);
+ else
+ return(NULL);
+}
+
+/*
+ - slow - step through the string more deliberately
+ == static char *slow(register struct match *m, char *start, \
+ == char *stop, sopno startst, sopno stopst);
+ */
+static char * /* where it ended */
+slow(m, start, stop, startst, stopst)
+register struct match *m;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+{
+ register states st = m->st;
+ register states empty = m->empty;
+ register states tmp = m->tmp;
+ register char *p = start;
+ register int c = (start == m->beginp) ? OUT : *(start-1);
+ register int lastc; /* previous c */
+ register int flagch;
+ register int i;
+ register char *matchp; /* last p at which a match ended */
+
+ AT("slow", start, stop, startst, stopst);
+ CLEAR(st);
+ SET1(st, startst);
+ SP("sstart", st, *p);
+ st = step(m->g, startst, stopst, st, NOTHING, st);
+ matchp = NULL;
+ for (;;) {
+ /* next character */
+ lastc = c;
+ c = (p == m->endp) ? OUT : *p;
+
+ /* is there an EOL and/or BOL between lastc and c? */
+ flagch = '\0';
+ i = 0;
+ if ( (lastc == '\n' && m->g->cflags&REG_NEWLINE) ||
+ (lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
+ flagch = BOL;
+ i = m->g->nbol;
+ }
+ if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
+ (c == OUT && !(m->eflags&REG_NOTEOL)) ) {
+ flagch = (flagch == BOL) ? BOLEOL : EOL;
+ i += m->g->neol;
+ }
+ if (i != 0) {
+ for (; i > 0; i--)
+ st = step(m->g, startst, stopst, st, flagch, st);
+ SP("sboleol", st, c);
+ }
+
+ /* how about a word boundary? */
+ if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) &&
+ (c != OUT && ISWORD(c)) ) {
+ flagch = BOW;
+ }
+ if ( (lastc != OUT && ISWORD(lastc)) &&
+ (flagch == EOL || (c != OUT && !ISWORD(c))) ) {
+ flagch = EOW;
+ }
+ if (flagch == BOW || flagch == EOW) {
+ st = step(m->g, startst, stopst, st, flagch, st);
+ SP("sboweow", st, c);
+ }
+
+ /* are we done? */
+ if (ISSET(st, stopst))
+ matchp = p;
+ if (EQ(st, empty) || p == stop)
+ break; /* NOTE BREAK OUT */
+
+ /* no, we must deal with this character */
+ ASSIGN(tmp, st);
+ ASSIGN(st, empty);
+ assert(c != OUT);
+ st = step(m->g, startst, stopst, tmp, c, st);
+ SP("saft", st, c);
+ assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
+ p++;
+ }
+
+ return(matchp);
+}
+
+
+/*
+ - step - map set of states reachable before char to set reachable after
+ == static states step(register struct re_guts *g, sopno start, sopno stop, \
+ == register states bef, int ch, register states aft);
+ == #define BOL (OUT+1)
+ == #define EOL (BOL+1)
+ == #define BOLEOL (BOL+2)
+ == #define NOTHING (BOL+3)
+ == #define BOW (BOL+4)
+ == #define EOW (BOL+5)
+ == #define CODEMAX (BOL+5) // highest code used
+ == #define NONCHAR(c) ((c) > CHAR_MAX)
+ == #define NNONCHAR (CODEMAX-CHAR_MAX)
+ */
+static states
+step(g, start, stop, bef, ch, aft)
+register struct re_guts *g;
+sopno start; /* start state within strip */
+sopno stop; /* state after stop state within strip */
+register states bef; /* states reachable before */
+int ch; /* character or NONCHAR code */
+register states aft; /* states already known reachable after */
+{
+ register cset *cs;
+ register sop s;
+ register sopno pc;
+ register onestate here; /* note, macros know this name */
+ register sopno look;
+ register int i;
+
+ for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) {
+ s = g->strip[pc];
+ switch (OP(s)) {
+ case OEND:
+ assert(pc == stop-1);
+ break;
+ case OCHAR:
+ /* only characters can match */
+ assert(!NONCHAR(ch) || ch != (char)OPND(s));
+ if (ch == (char)OPND(s))
+ FWD(aft, bef, 1);
+ break;
+ case OBOL:
+ if (ch == BOL || ch == BOLEOL)
+ FWD(aft, bef, 1);
+ break;
+ case OEOL:
+ if (ch == EOL || ch == BOLEOL)
+ FWD(aft, bef, 1);
+ break;
+ case OBOW:
+ if (ch == BOW)
+ FWD(aft, bef, 1);
+ break;
+ case OEOW:
+ if (ch == EOW)
+ FWD(aft, bef, 1);
+ break;
+ case OANY:
+ if (!NONCHAR(ch))
+ FWD(aft, bef, 1);
+ break;
+ case OANYOF:
+ cs = &g->sets[OPND(s)];
+ if (!NONCHAR(ch) && CHIN(cs, ch))
+ FWD(aft, bef, 1);
+ break;
+ case OBACK_: /* ignored here */
+ case O_BACK:
+ FWD(aft, aft, 1);
+ break;
+ case OPLUS_: /* forward, this is just an empty */
+ FWD(aft, aft, 1);
+ break;
+ case O_PLUS: /* both forward and back */
+ FWD(aft, aft, 1);
+ i = ISSETBACK(aft, OPND(s));
+ BACK(aft, aft, OPND(s));
+ if (!i && ISSETBACK(aft, OPND(s))) {
+ /* oho, must reconsider loop body */
+ pc -= OPND(s) + 1;
+ INIT(here, pc);
+ }
+ break;
+ case OQUEST_: /* two branches, both forward */
+ FWD(aft, aft, 1);
+ FWD(aft, aft, OPND(s));
+ break;
+ case O_QUEST: /* just an empty */
+ FWD(aft, aft, 1);
+ break;
+ case OLPAREN: /* not significant here */
+ case ORPAREN:
+ FWD(aft, aft, 1);
+ break;
+ case OCH_: /* mark the first two branches */
+ FWD(aft, aft, 1);
+ assert(OP(g->strip[pc+OPND(s)]) == OOR2);
+ FWD(aft, aft, OPND(s));
+ break;
+ case OOR1: /* done a branch, find the O_CH */
+ if (ISSTATEIN(aft, here)) {
+ for (look = 1;
+ OP(s = g->strip[pc+look]) != O_CH;
+ look += OPND(s))
+ assert(OP(s) == OOR2);
+ FWD(aft, aft, look);
+ }
+ break;
+ case OOR2: /* propagate OCH_'s marking */
+ FWD(aft, aft, 1);
+ if (OP(g->strip[pc+OPND(s)]) != O_CH) {
+ assert(OP(g->strip[pc+OPND(s)]) == OOR2);
+ FWD(aft, aft, OPND(s));
+ }
+ break;
+ case O_CH: /* just empty */
+ FWD(aft, aft, 1);
+ break;
+ default: /* ooooops... */
+ assert(nope);
+ break;
+ }
+ }
+
+ return(aft);
+}
+
+#ifdef REDEBUG
+/*
+ - print - print a set of states
+ == #ifdef REDEBUG
+ == static void print(struct match *m, char *caption, states st, \
+ == int ch, FILE *d);
+ == #endif
+ */
+static void
+print(m, caption, st, ch, d)
+struct match *m;
+char *caption;
+states st;
+int ch;
+FILE *d;
+{
+ register struct re_guts *g = m->g;
+ register int i;
+ register int first = 1;
+
+ if (!(m->eflags&REG_TRACE))
+ return;
+
+ fprintf(d, "%s", caption);
+ if (ch != '\0')
+ fprintf(d, " %s", pchar(ch));
+ for (i = 0; i < g->nstates; i++)
+ if (ISSET(st, i)) {
+ fprintf(d, "%s%d", (first) ? "\t" : ", ", i);
+ first = 0;
+ }
+ fprintf(d, "\n");
+}
+
+/*
+ - at - print current situation
+ == #ifdef REDEBUG
+ == static void at(struct match *m, char *title, char *start, char *stop, \
+ == sopno startst, sopno stopst);
+ == #endif
+ */
+static void
+at(m, title, start, stop, startst, stopst)
+struct match *m;
+char *title;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+{
+ if (!(m->eflags&REG_TRACE))
+ return;
+
+ printf("%s %s-", title, pchar(*start));
+ printf("%s ", pchar(*stop));
+ printf("%ld-%ld\n", (long)startst, (long)stopst);
+}
+
+#ifndef PCHARDONE
+#define PCHARDONE /* never again */
+/*
+ - pchar - make a character printable
+ == #ifdef REDEBUG
+ == static char *pchar(int ch);
+ == #endif
+ *
+ * Is this identical to regchar() over in debug.c? Well, yes. But a
+ * duplicate here avoids having a debugging-capable regexec.o tied to
+ * a matching debug.o, and this is convenient. It all disappears in
+ * the non-debug compilation anyway, so it doesn't matter much.
+ */
+static char * /* -> representation */
+pchar(ch)
+int ch;
+{
+ static char pbuf[10];
+
+ if (isprint(ch) || ch == ' ')
+ sprintf(pbuf, "%c", ch);
+ else
+ sprintf(pbuf, "\\%o", ch);
+ return(pbuf);
+}
+#endif
+#endif
+
+#undef matcher
+#undef fast
+#undef slow
+#undef dissect
+#undef backref
+#undef step
+#undef print
+#undef at
+#undef match
diff --git a/ext/ereg/regex/main.c b/ext/ereg/regex/main.c
new file mode 100644
index 0000000..657338a
--- /dev/null
+++ b/ext/ereg/regex/main.c
@@ -0,0 +1,510 @@
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <regex.h>
+#include <assert.h>
+#include <stdlib.h>
+
+#include "main.ih"
+
+char *progname;
+int debug = 0;
+int line = 0;
+int status = 0;
+
+int copts = REG_EXTENDED;
+int eopts = 0;
+regoff_t startoff = 0;
+regoff_t endoff = 0;
+
+
+extern int split();
+extern void regprint();
+
+/*
+ - main - do the simple case, hand off to regress() for regression
+ */
+int main(argc, argv)
+int argc;
+char *argv[];
+{
+ regex_t re;
+# define NS 10
+ regmatch_t subs[NS];
+ char erbuf[100];
+ int err;
+ size_t len;
+ int c;
+ int errflg = 0;
+ register int i;
+ extern int optind;
+ extern char *optarg;
+
+ progname = argv[0];
+
+ while ((c = getopt(argc, argv, "c:e:S:E:x")) != EOF)
+ switch (c) {
+ case 'c': /* compile options */
+ copts = options('c', optarg);
+ break;
+ case 'e': /* execute options */
+ eopts = options('e', optarg);
+ break;
+ case 'S': /* start offset */
+ startoff = (regoff_t)atoi(optarg);
+ break;
+ case 'E': /* end offset */
+ endoff = (regoff_t)atoi(optarg);
+ break;
+ case 'x': /* Debugging. */
+ debug++;
+ break;
+ case '?':
+ default:
+ errflg++;
+ break;
+ }
+ if (errflg) {
+ fprintf(stderr, "usage: %s ", progname);
+ fprintf(stderr, "[-c copt][-C][-d] [re]\n");
+ exit(2);
+ }
+
+ if (optind >= argc) {
+ regress(stdin);
+ exit(status);
+ }
+
+ err = regcomp(&re, argv[optind++], copts);
+ if (err) {
+ len = regerror(err, &re, erbuf, sizeof(erbuf));
+ fprintf(stderr, "error %s, %d/%d `%s'\n",
+ eprint(err), len, sizeof(erbuf), erbuf);
+ exit(status);
+ }
+ regprint(&re, stdout);
+
+ if (optind >= argc) {
+ regfree(&re);
+ exit(status);
+ }
+
+ if (eopts&REG_STARTEND) {
+ subs[0].rm_so = startoff;
+ subs[0].rm_eo = strlen(argv[optind]) - endoff;
+ }
+ err = regexec(&re, argv[optind], (size_t)NS, subs, eopts);
+ if (err) {
+ len = regerror(err, &re, erbuf, sizeof(erbuf));
+ fprintf(stderr, "error %s, %d/%d `%s'\n",
+ eprint(err), len, sizeof(erbuf), erbuf);
+ exit(status);
+ }
+ if (!(copts&REG_NOSUB)) {
+ len = (int)(subs[0].rm_eo - subs[0].rm_so);
+ if (subs[0].rm_so != -1) {
+ if (len != 0)
+ printf("match `%.*s'\n", (int)len,
+ argv[optind] + subs[0].rm_so);
+ else
+ printf("match `'@%.1s\n",
+ argv[optind] + subs[0].rm_so);
+ }
+ for (i = 1; i < NS; i++)
+ if (subs[i].rm_so != -1)
+ printf("(%d) `%.*s'\n", i,
+ (int)(subs[i].rm_eo - subs[i].rm_so),
+ argv[optind] + subs[i].rm_so);
+ }
+ exit(status);
+}
+
+/*
+ - regress - main loop of regression test
+ == void regress(FILE *in);
+ */
+void
+regress(in)
+FILE *in;
+{
+ char inbuf[1000];
+# define MAXF 10
+ char *f[MAXF];
+ int nf;
+ int i;
+ char erbuf[100];
+ size_t ne;
+ char *badpat = "invalid regular expression";
+# define SHORT 10
+ char *bpname = "REG_BADPAT";
+ regex_t re;
+
+ while (fgets(inbuf, sizeof(inbuf), in) != NULL) {
+ line++;
+ if (inbuf[0] == '#' || inbuf[0] == '\n')
+ continue; /* NOTE CONTINUE */
+ inbuf[strlen(inbuf)-1] = '\0'; /* get rid of stupid \n */
+ if (debug)
+ fprintf(stdout, "%d:\n", line);
+ nf = split(inbuf, f, MAXF, "\t\t");
+ if (nf < 3) {
+ fprintf(stderr, "bad input, line %d\n", line);
+ exit(1);
+ }
+ for (i = 0; i < nf; i++)
+ if (strcmp(f[i], "\"\"") == 0)
+ f[i] = "";
+ if (nf <= 3)
+ f[3] = NULL;
+ if (nf <= 4)
+ f[4] = NULL;
+ try(f[0], f[1], f[2], f[3], f[4], options('c', f[1]));
+ if (opt('&', f[1])) /* try with either type of RE */
+ try(f[0], f[1], f[2], f[3], f[4],
+ options('c', f[1]) &~ REG_EXTENDED);
+ }
+
+ ne = regerror(REG_BADPAT, (regex_t *)NULL, erbuf, sizeof(erbuf));
+ if (strcmp(erbuf, badpat) != 0 || ne != strlen(badpat)+1) {
+ fprintf(stderr, "end: regerror() test gave `%s' not `%s'\n",
+ erbuf, badpat);
+ status = 1;
+ }
+ ne = regerror(REG_BADPAT, (regex_t *)NULL, erbuf, (size_t)SHORT);
+ if (strncmp(erbuf, badpat, SHORT-1) != 0 || erbuf[SHORT-1] != '\0' ||
+ ne != strlen(badpat)+1) {
+ fprintf(stderr, "end: regerror() short test gave `%s' not `%.*s'\n",
+ erbuf, SHORT-1, badpat);
+ status = 1;
+ }
+ ne = regerror(REG_ITOA|REG_BADPAT, (regex_t *)NULL, erbuf, sizeof(erbuf));
+ if (strcmp(erbuf, bpname) != 0 || ne != strlen(bpname)+1) {
+ fprintf(stderr, "end: regerror() ITOA test gave `%s' not `%s'\n",
+ erbuf, bpname);
+ status = 1;
+ }
+ re.re_endp = bpname;
+ ne = regerror(REG_ATOI, &re, erbuf, sizeof(erbuf));
+ if (atoi(erbuf) != (int)REG_BADPAT) {
+ fprintf(stderr, "end: regerror() ATOI test gave `%s' not `%ld'\n",
+ erbuf, (long)REG_BADPAT);
+ status = 1;
+ } else if (ne != strlen(erbuf)+1) {
+ fprintf(stderr, "end: regerror() ATOI test len(`%s') = %ld\n",
+ erbuf, (long)REG_BADPAT);
+ status = 1;
+ }
+}
+
+/*
+ - try - try it, and report on problems
+ == void try(char *f0, char *f1, char *f2, char *f3, char *f4, int opts);
+ */
+void
+try(f0, f1, f2, f3, f4, opts)
+char *f0;
+char *f1;
+char *f2;
+char *f3;
+char *f4;
+int opts; /* may not match f1 */
+{
+ regex_t re;
+# define NSUBS 10
+ regmatch_t subs[NSUBS];
+# define NSHOULD 15
+ char *should[NSHOULD];
+ int nshould;
+ char erbuf[100];
+ int err;
+ int len;
+ char *type = (opts & REG_EXTENDED) ? "ERE" : "BRE";
+ register int i;
+ char *grump;
+ char f0copy[1000];
+ char f2copy[1000];
+
+ strcpy(f0copy, f0);
+ re.re_endp = (opts&REG_PEND) ? f0copy + strlen(f0copy) : NULL;
+ fixstr(f0copy);
+ err = regcomp(&re, f0copy, opts);
+ if (err != 0 && (!opt('C', f1) || err != efind(f2))) {
+ /* unexpected error or wrong error */
+ len = regerror(err, &re, erbuf, sizeof(erbuf));
+ fprintf(stderr, "%d: %s error %s, %d/%d `%s'\n",
+ line, type, eprint(err), len,
+ sizeof(erbuf), erbuf);
+ status = 1;
+ } else if (err == 0 && opt('C', f1)) {
+ /* unexpected success */
+ fprintf(stderr, "%d: %s should have given REG_%s\n",
+ line, type, f2);
+ status = 1;
+ err = 1; /* so we won't try regexec */
+ }
+
+ if (err != 0) {
+ regfree(&re);
+ return;
+ }
+
+ strcpy(f2copy, f2);
+ fixstr(f2copy);
+
+ if (options('e', f1)&REG_STARTEND) {
+ if (strchr(f2, '(') == NULL || strchr(f2, ')') == NULL)
+ fprintf(stderr, "%d: bad STARTEND syntax\n", line);
+ subs[0].rm_so = strchr(f2, '(') - f2 + 1;
+ subs[0].rm_eo = strchr(f2, ')') - f2;
+ }
+ err = regexec(&re, f2copy, NSUBS, subs, options('e', f1));
+
+ if (err != 0 && (f3 != NULL || err != REG_NOMATCH)) {
+ /* unexpected error or wrong error */
+ len = regerror(err, &re, erbuf, sizeof(erbuf));
+ fprintf(stderr, "%d: %s exec error %s, %d/%d `%s'\n",
+ line, type, eprint(err), len,
+ sizeof(erbuf), erbuf);
+ status = 1;
+ } else if (err != 0) {
+ /* nothing more to check */
+ } else if (f3 == NULL) {
+ /* unexpected success */
+ fprintf(stderr, "%d: %s exec should have failed\n",
+ line, type);
+ status = 1;
+ err = 1; /* just on principle */
+ } else if (opts&REG_NOSUB) {
+ /* nothing more to check */
+ } else if ((grump = check(f2, subs[0], f3)) != NULL) {
+ fprintf(stderr, "%d: %s %s\n", line, type, grump);
+ status = 1;
+ err = 1;
+ }
+
+ if (err != 0 || f4 == NULL) {
+ regfree(&re);
+ return;
+ }
+
+ for (i = 1; i < NSHOULD; i++)
+ should[i] = NULL;
+ nshould = split(f4, should+1, NSHOULD-1, ",");
+ if (nshould == 0) {
+ nshould = 1;
+ should[1] = "";
+ }
+ for (i = 1; i < NSUBS; i++) {
+ grump = check(f2, subs[i], should[i]);
+ if (grump != NULL) {
+ fprintf(stderr, "%d: %s $%d %s\n", line,
+ type, i, grump);
+ status = 1;
+ err = 1;
+ }
+ }
+
+ regfree(&re);
+}
+
+/*
+ - options - pick options out of a regression-test string
+ == int options(int type, char *s);
+ */
+int
+options(type, s)
+int type; /* 'c' compile, 'e' exec */
+char *s;
+{
+ register char *p;
+ register int o = (type == 'c') ? copts : eopts;
+ register char *legal = (type == 'c') ? "bisnmp" : "^$#tl";
+
+ for (p = s; *p != '\0'; p++)
+ if (strchr(legal, *p) != NULL)
+ switch (*p) {
+ case 'b':
+ o &= ~REG_EXTENDED;
+ break;
+ case 'i':
+ o |= REG_ICASE;
+ break;
+ case 's':
+ o |= REG_NOSUB;
+ break;
+ case 'n':
+ o |= REG_NEWLINE;
+ break;
+ case 'm':
+ o &= ~REG_EXTENDED;
+ o |= REG_NOSPEC;
+ break;
+ case 'p':
+ o |= REG_PEND;
+ break;
+ case '^':
+ o |= REG_NOTBOL;
+ break;
+ case '$':
+ o |= REG_NOTEOL;
+ break;
+ case '#':
+ o |= REG_STARTEND;
+ break;
+ case 't': /* trace */
+ o |= REG_TRACE;
+ break;
+ case 'l': /* force long representation */
+ o |= REG_LARGE;
+ break;
+ case 'r': /* force backref use */
+ o |= REG_BACKR;
+ break;
+ }
+ return(o);
+}
+
+/*
+ - opt - is a particular option in a regression string?
+ == int opt(int c, char *s);
+ */
+int /* predicate */
+opt(c, s)
+int c;
+char *s;
+{
+ return(strchr(s, c) != NULL);
+}
+
+/*
+ - fixstr - transform magic characters in strings
+ == void fixstr(register char *p);
+ */
+void
+fixstr(p)
+register char *p;
+{
+ if (p == NULL)
+ return;
+
+ for (; *p != '\0'; p++)
+ if (*p == 'N')
+ *p = '\n';
+ else if (*p == 'T')
+ *p = '\t';
+ else if (*p == 'S')
+ *p = ' ';
+ else if (*p == 'Z')
+ *p = '\0';
+}
+
+/*
+ - check - check a substring match
+ == char *check(char *str, regmatch_t sub, char *should);
+ */
+char * /* NULL or complaint */
+check(str, sub, should)
+char *str;
+regmatch_t sub;
+char *should;
+{
+ register int len;
+ register int shlen;
+ register char *p;
+ static char grump[500];
+ register char *at = NULL;
+
+ if (should != NULL && strcmp(should, "-") == 0)
+ should = NULL;
+ if (should != NULL && should[0] == '@') {
+ at = should + 1;
+ should = "";
+ }
+
+ /* check rm_so and rm_eo for consistency */
+ if (sub.rm_so > sub.rm_eo || (sub.rm_so == -1 && sub.rm_eo != -1) ||
+ (sub.rm_so != -1 && sub.rm_eo == -1) ||
+ (sub.rm_so != -1 && sub.rm_so < 0) ||
+ (sub.rm_eo != -1 && sub.rm_eo < 0) ) {
+ sprintf(grump, "start %ld end %ld", (long)sub.rm_so,
+ (long)sub.rm_eo);
+ return(grump);
+ }
+
+ /* check for no match */
+ if (sub.rm_so == -1 && should == NULL)
+ return(NULL);
+ if (sub.rm_so == -1)
+ return("did not match");
+
+ /* check for in range */
+ if (sub.rm_eo > strlen(str)) {
+ sprintf(grump, "start %ld end %ld, past end of string",
+ (long)sub.rm_so, (long)sub.rm_eo);
+ return(grump);
+ }
+
+ len = (int)(sub.rm_eo - sub.rm_so);
+ shlen = (int)strlen(should);
+ p = str + sub.rm_so;
+
+ /* check for not supposed to match */
+ if (should == NULL) {
+ sprintf(grump, "matched `%.*s'", len, p);
+ return(grump);
+ }
+
+ /* check for wrong match */
+ if (len != shlen || strncmp(p, should, (size_t)shlen) != 0) {
+ sprintf(grump, "matched `%.*s' instead", len, p);
+ return(grump);
+ }
+ if (shlen > 0)
+ return(NULL);
+
+ /* check null match in right place */
+ if (at == NULL)
+ return(NULL);
+ shlen = strlen(at);
+ if (shlen == 0)
+ shlen = 1; /* force check for end-of-string */
+ if (strncmp(p, at, shlen) != 0) {
+ sprintf(grump, "matched null at `%.20s'", p);
+ return(grump);
+ }
+ return(NULL);
+}
+
+/*
+ - eprint - convert error number to name
+ == static char *eprint(int err);
+ */
+static char *
+eprint(err)
+int err;
+{
+ static char epbuf[100];
+ size_t len;
+
+ len = regerror(REG_ITOA|err, (regex_t *)NULL, epbuf, sizeof(epbuf));
+ assert(len <= sizeof(epbuf));
+ return(epbuf);
+}
+
+/*
+ - efind - convert error name to number
+ == static int efind(char *name);
+ */
+static int
+efind(name)
+char *name;
+{
+ static char efbuf[100];
+ regex_t re;
+
+ sprintf(efbuf, "REG_%s", name);
+ assert(strlen(efbuf) < sizeof(efbuf));
+ re.re_endp = efbuf;
+ (void) regerror(REG_ATOI, &re, efbuf, sizeof(efbuf));
+ return(atoi(efbuf));
+}
diff --git a/ext/ereg/regex/mkh b/ext/ereg/regex/mkh
new file mode 100644
index 0000000..252b246
--- /dev/null
+++ b/ext/ereg/regex/mkh
@@ -0,0 +1,76 @@
+#! /bin/sh
+# mkh - pull headers out of C source
+PATH=/bin:/usr/bin ; export PATH
+
+# egrep pattern to pick out marked lines
+egrep='^ =([ ]|$)'
+
+# Sed program to process marked lines into lines for the header file.
+# The markers have already been removed. Two things are done here: removal
+# of backslashed newlines, and some fudging of comments. The first is done
+# because -o needs to have prototypes on one line to strip them down.
+# Getting comments into the output is tricky; we turn C++-style // comments
+# into /* */ comments, after altering any existing */'s to avoid trouble.
+peel=' /\\$/N
+ /\\\n[ ]*/s///g
+ /\/\//s;\*/;* /;g
+ /\/\//s;//\(.*\);/*\1 */;'
+
+for a
+do
+ case "$a" in
+ -o) # old (pre-function-prototype) compiler
+ # add code to comment out argument lists
+ peel="$peel
+ "'/^\([^#\/][^\/]*[a-zA-Z0-9_)]\)(\(.*\))/s;;\1(/*\2*/);'
+ shift
+ ;;
+ -b) # funny Berkeley __P macro
+ peel="$peel
+ "'/^\([^#\/][^\/]*[a-zA-Z0-9_)]\)(\(.*\))/s;;\1 __P((\2));'
+ shift
+ ;;
+ -s) # compiler doesn't like `static foo();'
+ # add code to get rid of the `static'
+ peel="$peel
+ "'/^static[ ][^\/]*[a-zA-Z0-9_)](.*)/s;static.;;'
+ shift
+ ;;
+ -p) # private declarations
+ egrep='^ ==([ ]|$)'
+ shift
+ ;;
+ -i) # wrap in #ifndef, argument is name
+ ifndef="$2"
+ shift ; shift
+ ;;
+ *) break
+ ;;
+ esac
+done
+
+if test " $ifndef" != " "
+then
+ echo "#ifndef $ifndef"
+ echo "#define $ifndef /* never again */"
+fi
+echo "/* ========= begin header generated by $0 ========= */"
+echo '#ifdef __cplusplus'
+echo 'extern "C" {'
+echo '#endif'
+for f
+do
+ echo
+ echo "/* === $f === */"
+ egrep "$egrep" $f | sed 's/^ ==*[ ]//;s/^ ==*$//' | sed "$peel"
+ echo
+done
+echo '#ifdef __cplusplus'
+echo '}'
+echo '#endif'
+echo "/* ========= end header generated by $0 ========= */"
+if test " $ifndef" != " "
+then
+ echo "#endif"
+fi
+exit 0
diff --git a/ext/ereg/regex/regcomp.c b/ext/ereg/regex/regcomp.c
new file mode 100644
index 0000000..7f651bf
--- /dev/null
+++ b/ext/ereg/regex/regcomp.c
@@ -0,0 +1,1546 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regex2.h"
+
+#include "cclass.h"
+#include "cname.h"
+
+/*
+ * parse structure, passed up and down to avoid global variables and
+ * other clumsinesses
+ */
+struct parse {
+ char *next; /* next character in RE */
+ char *end; /* end of string (-> NUL normally) */
+ int error; /* has an error been seen? */
+ sop *strip; /* malloced strip */
+ sopno ssize; /* malloced strip size (allocated) */
+ sopno slen; /* malloced strip length (used) */
+ int ncsalloc; /* number of csets allocated */
+ struct re_guts *g;
+# define NPAREN 10 /* we need to remember () 1-9 for back refs */
+ sopno pbegin[NPAREN]; /* -> ( ([0] unused) */
+ sopno pend[NPAREN]; /* -> ) ([0] unused) */
+};
+
+#include "regcomp.ih"
+
+static char nuls[10]; /* place to point scanner in event of error */
+
+/*
+ * macros for use with parse structure
+ * BEWARE: these know that the parse structure is named `p' !!!
+ */
+#define PEEK() (*p->next)
+#define PEEK2() (*(p->next+1))
+#define MORE() (p->next < p->end)
+#define MORE2() (p->next+1 < p->end)
+#define SEE(c) (MORE() && PEEK() == (c))
+#define SEETWO(a, b) (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b))
+#define EAT(c) ((SEE(c)) ? (NEXT1(), 1) : 0)
+#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0)
+#define NEXT1() (p->next++)
+#define NEXT2() (p->next += 2)
+#define NEXTn(n) (p->next += (n))
+#define GETNEXT() (*p->next++)
+#define SETERROR(e) seterr(p, (e))
+#define REQUIRE(co, e) ((void)((co) || SETERROR(e)))
+#define MUSTSEE(c, e) (REQUIRE(MORE() && PEEK() == (c), e))
+#define MUSTEAT(c, e) (REQUIRE(MORE() && GETNEXT() == (c), e))
+#define MUSTNOTSEE(c, e) (REQUIRE(!MORE() || PEEK() != (c), e))
+#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd))
+#define INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos)
+#define AHEAD(pos) dofwd(p, pos, HERE()-(pos))
+#define ASTERN(sop, pos) EMIT(sop, HERE()-pos)
+#define HERE() (p->slen)
+#define THERE() (p->slen - 1)
+#define THERETHERE() (p->slen - 2)
+#define DROP(n) (p->slen -= (n))
+
+#ifndef NDEBUG
+static int never = 0; /* for use in asserts; shuts lint up */
+#else
+#define never 0 /* some <assert.h>s have bugs too */
+#endif
+
+/*
+ - regcomp - interface for parser and compilation
+ = API_EXPORT(int) regcomp(regex_t *, const char *, int);
+ = #define REG_BASIC 0000
+ = #define REG_EXTENDED 0001
+ = #define REG_ICASE 0002
+ = #define REG_NOSUB 0004
+ = #define REG_NEWLINE 0010
+ = #define REG_NOSPEC 0020
+ = #define REG_PEND 0040
+ = #define REG_DUMP 0200
+ */
+API_EXPORT(int) /* 0 success, otherwise REG_something */
+regcomp(preg, pattern, cflags)
+regex_t *preg;
+const char *pattern;
+int cflags;
+{
+ struct parse pa;
+ register struct re_guts *g;
+ register struct parse *p = &pa;
+ register int i;
+ register size_t len;
+#ifdef REDEBUG
+# define GOODFLAGS(f) (f)
+#else
+# define GOODFLAGS(f) ((f)&~REG_DUMP)
+#endif
+
+ cflags = GOODFLAGS(cflags);
+ if ((cflags&REG_EXTENDED) && (cflags&REG_NOSPEC))
+ return(REG_INVARG);
+
+ if (cflags&REG_PEND) {
+ if (preg->re_endp < pattern)
+ return(REG_INVARG);
+ len = preg->re_endp - pattern;
+ } else
+ len = strlen((char *)pattern);
+
+ /* do the mallocs early so failure handling is easy */
+ g = (struct re_guts *)malloc(sizeof(struct re_guts) +
+ (NC-1)*sizeof(cat_t));
+ if (g == NULL)
+ return(REG_ESPACE);
+ p->ssize = len/(size_t)2*(size_t)3 + (size_t)1; /* ugh */
+ p->strip = (sop *)malloc(p->ssize * sizeof(sop));
+ p->slen = 0;
+ if (p->strip == NULL) {
+ free((char *)g);
+ return(REG_ESPACE);
+ }
+
+ /* set things up */
+ p->g = g;
+ p->next = (char *)pattern; /* convenience; we do not modify it */
+ p->end = p->next + len;
+ p->error = 0;
+ p->ncsalloc = 0;
+ for (i = 0; i < NPAREN; i++) {
+ p->pbegin[i] = 0;
+ p->pend[i] = 0;
+ }
+ g->csetsize = NC;
+ g->sets = NULL;
+ g->setbits = NULL;
+ g->ncsets = 0;
+ g->cflags = cflags;
+ g->iflags = 0;
+ g->nbol = 0;
+ g->neol = 0;
+ g->must = NULL;
+ g->mlen = 0;
+ g->nsub = 0;
+ g->ncategories = 1; /* category 0 is "everything else" */
+ g->categories = &g->catspace[-(CHAR_MIN)];
+ (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t));
+ g->backrefs = 0;
+
+ /* do it */
+ EMIT(OEND, 0);
+ g->firststate = THERE();
+ if (cflags&REG_EXTENDED)
+ p_ere(p, OUT);
+ else if (cflags&REG_NOSPEC)
+ p_str(p);
+ else
+ p_bre(p, OUT, OUT);
+ EMIT(OEND, 0);
+ g->laststate = THERE();
+
+ /* tidy up loose ends and fill things in */
+ categorize(p, g);
+ stripsnug(p, g);
+ findmust(p, g);
+ g->nplus = pluscount(p, g);
+ g->magic = MAGIC2;
+ preg->re_nsub = g->nsub;
+ preg->re_g = g;
+ preg->re_magic = MAGIC1;
+#ifndef REDEBUG
+ /* not debugging, so can't rely on the assert() in regexec() */
+ if (g->iflags&BAD)
+ SETERROR(REG_ASSERT);
+#endif
+
+ /* win or lose, we're done */
+ if (p->error != 0) /* lose */
+ regfree(preg);
+ return(p->error);
+}
+
+/*
+ - p_ere - ERE parser top level, concatenation and alternation
+ == static void p_ere(register struct parse *p, int stop);
+ */
+static void
+p_ere(p, stop)
+register struct parse *p;
+int stop; /* character this ERE should end at */
+{
+ register char c;
+ register sopno prevback = 0;
+ register sopno prevfwd = 0;
+ register sopno conc;
+ register int first = 1; /* is this the first alternative? */
+
+ for (;;) {
+ /* do a bunch of concatenated expressions */
+ conc = HERE();
+ while (MORE() && (c = PEEK()) != '|' && c != stop)
+ p_ere_exp(p);
+ REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */
+
+ if (!EAT('|'))
+ break; /* NOTE BREAK OUT */
+
+ if (first) {
+ INSERT(OCH_, conc); /* offset is wrong */
+ prevfwd = conc;
+ prevback = conc;
+ first = 0;
+ }
+ ASTERN(OOR1, prevback);
+ prevback = THERE();
+ AHEAD(prevfwd); /* fix previous offset */
+ prevfwd = HERE();
+ EMIT(OOR2, 0); /* offset is very wrong */
+ }
+
+ if (!first) { /* tail-end fixups */
+ AHEAD(prevfwd);
+ ASTERN(O_CH, prevback);
+ }
+
+ assert(!MORE() || SEE(stop));
+}
+
+/*
+ - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op
+ == static void p_ere_exp(register struct parse *p);
+ */
+static void
+p_ere_exp(p)
+register struct parse *p;
+{
+ register char c;
+ register sopno pos;
+ register int count;
+ register int count2;
+ register sopno subno;
+ int wascaret = 0;
+
+ assert(MORE()); /* caller should have ensured this */
+ c = GETNEXT();
+
+ pos = HERE();
+ switch (c) {
+ case '(':
+ REQUIRE(MORE(), REG_EPAREN);
+ p->g->nsub++;
+ subno = p->g->nsub;
+ if (subno < NPAREN)
+ p->pbegin[subno] = HERE();
+ EMIT(OLPAREN, subno);
+ if (!SEE(')'))
+ p_ere(p, ')');
+ if (subno < NPAREN) {
+ p->pend[subno] = HERE();
+ assert(p->pend[subno] != 0);
+ }
+ EMIT(ORPAREN, subno);
+ MUSTEAT(')', REG_EPAREN);
+ break;
+#ifndef POSIX_MISTAKE
+ case ')': /* happens only if no current unmatched ( */
+ /*
+ * You may ask, why the ifndef? Because I didn't notice
+ * this until slightly too late for 1003.2, and none of the
+ * other 1003.2 regular-expression reviewers noticed it at
+ * all. So an unmatched ) is legal POSIX, at least until
+ * we can get it fixed.
+ */
+ SETERROR(REG_EPAREN);
+ break;
+#endif
+ case '^':
+ EMIT(OBOL, 0);
+ p->g->iflags |= USEBOL;
+ p->g->nbol++;
+ wascaret = 1;
+ break;
+ case '$':
+ EMIT(OEOL, 0);
+ p->g->iflags |= USEEOL;
+ p->g->neol++;
+ break;
+ case '|':
+ SETERROR(REG_EMPTY);
+ break;
+ case '*':
+ case '+':
+ case '?':
+ SETERROR(REG_BADRPT);
+ break;
+ case '.':
+ if (p->g->cflags&REG_NEWLINE)
+ nonnewline(p);
+ else
+ EMIT(OANY, 0);
+ break;
+ case '[':
+ p_bracket(p);
+ break;
+ case '\\':
+ REQUIRE(MORE(), REG_EESCAPE);
+ c = GETNEXT();
+ ordinary(p, c);
+ break;
+ case '{': /* okay as ordinary except if digit follows */
+ REQUIRE(!MORE() || !isdigit(PEEK()), REG_BADRPT);
+ /* FALLTHROUGH */
+ default:
+ ordinary(p, c);
+ break;
+ }
+
+ if (!MORE())
+ return;
+ c = PEEK();
+ /* we call { a repetition if followed by a digit */
+ if (!( c == '*' || c == '+' || c == '?' ||
+ (c == '{' && MORE2() && isdigit(PEEK2())) ))
+ return; /* no repetition, we're done */
+ NEXT1();
+
+ REQUIRE(!wascaret, REG_BADRPT);
+ switch (c) {
+ case '*': /* implemented as +? */
+ /* this case does not require the (y|) trick, noKLUDGE */
+ INSERT(OPLUS_, pos);
+ ASTERN(O_PLUS, pos);
+ INSERT(OQUEST_, pos);
+ ASTERN(O_QUEST, pos);
+ break;
+ case '+':
+ INSERT(OPLUS_, pos);
+ ASTERN(O_PLUS, pos);
+ break;
+ case '?':
+ /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
+ INSERT(OCH_, pos); /* offset slightly wrong */
+ ASTERN(OOR1, pos); /* this one's right */
+ AHEAD(pos); /* fix the OCH_ */
+ EMIT(OOR2, 0); /* offset very wrong... */
+ AHEAD(THERE()); /* ...so fix it */
+ ASTERN(O_CH, THERETHERE());
+ break;
+ case '{':
+ count = p_count(p);
+ if (EAT(',')) {
+ if (isdigit(PEEK())) {
+ count2 = p_count(p);
+ REQUIRE(count <= count2, REG_BADBR);
+ } else /* single number with comma */
+ count2 = INFINITY;
+ } else /* just a single number */
+ count2 = count;
+ repeat(p, pos, count, count2);
+ if (!EAT('}')) { /* error heuristics */
+ while (MORE() && PEEK() != '}')
+ NEXT1();
+ REQUIRE(MORE(), REG_EBRACE);
+ SETERROR(REG_BADBR);
+ }
+ break;
+ }
+
+ if (!MORE())
+ return;
+ c = PEEK();
+ if (!( c == '*' || c == '+' || c == '?' ||
+ (c == '{' && MORE2() && isdigit(PEEK2())) ) )
+ return;
+ SETERROR(REG_BADRPT);
+}
+
+/*
+ - p_str - string (no metacharacters) "parser"
+ == static void p_str(register struct parse *p);
+ */
+static void
+p_str(p)
+register struct parse *p;
+{
+ REQUIRE(MORE(), REG_EMPTY);
+ while (MORE())
+ ordinary(p, GETNEXT());
+}
+
+/*
+ - p_bre - BRE parser top level, anchoring and concatenation
+ == static void p_bre(register struct parse *p, register int end1, \
+ == register int end2);
+ * Giving end1 as OUT essentially eliminates the end1/end2 check.
+ *
+ * This implementation is a bit of a kludge, in that a trailing $ is first
+ * taken as an ordinary character and then revised to be an anchor. The
+ * only undesirable side effect is that '$' gets included as a character
+ * category in such cases. This is fairly harmless; not worth fixing.
+ * The amount of lookahead needed to avoid this kludge is excessive.
+ */
+static void
+p_bre(p, end1, end2)
+register struct parse *p;
+register int end1; /* first terminating character */
+register int end2; /* second terminating character */
+{
+ register sopno start = HERE();
+ register int first = 1; /* first subexpression? */
+ register int wasdollar = 0;
+
+ if (EAT('^')) {
+ EMIT(OBOL, 0);
+ p->g->iflags |= USEBOL;
+ p->g->nbol++;
+ }
+ while (MORE() && !SEETWO(end1, end2)) {
+ wasdollar = p_simp_re(p, first);
+ first = 0;
+ }
+ if (wasdollar) { /* oops, that was a trailing anchor */
+ DROP(1);
+ EMIT(OEOL, 0);
+ p->g->iflags |= USEEOL;
+ p->g->neol++;
+ }
+
+ REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */
+}
+
+/*
+ - p_simp_re - parse a simple RE, an atom possibly followed by a repetition
+ == static int p_simp_re(register struct parse *p, int starordinary);
+ */
+static int /* was the simple RE an unbackslashed $? */
+p_simp_re(p, starordinary)
+register struct parse *p;
+int starordinary; /* is a leading * an ordinary character? */
+{
+ register int c;
+ register int count;
+ register int count2;
+ register sopno pos;
+ register int i;
+ register sopno subno;
+# define BACKSL (1<<CHAR_BIT)
+
+ pos = HERE(); /* repetion op, if any, covers from here */
+
+ assert(MORE()); /* caller should have ensured this */
+ c = GETNEXT();
+ if (c == '\\') {
+ REQUIRE(MORE(), REG_EESCAPE);
+ c = BACKSL | (unsigned char)GETNEXT();
+ }
+ switch (c) {
+ case '.':
+ if (p->g->cflags&REG_NEWLINE)
+ nonnewline(p);
+ else
+ EMIT(OANY, 0);
+ break;
+ case '[':
+ p_bracket(p);
+ break;
+ case BACKSL|'{':
+ SETERROR(REG_BADRPT);
+ break;
+ case BACKSL|'(':
+ p->g->nsub++;
+ subno = p->g->nsub;
+ if (subno < NPAREN)
+ p->pbegin[subno] = HERE();
+ EMIT(OLPAREN, subno);
+ /* the MORE here is an error heuristic */
+ if (MORE() && !SEETWO('\\', ')'))
+ p_bre(p, '\\', ')');
+ if (subno < NPAREN) {
+ p->pend[subno] = HERE();
+ assert(p->pend[subno] != 0);
+ }
+ EMIT(ORPAREN, subno);
+ REQUIRE(EATTWO('\\', ')'), REG_EPAREN);
+ break;
+ case BACKSL|')': /* should not get here -- must be user */
+ case BACKSL|'}':
+ SETERROR(REG_EPAREN);
+ break;
+ case BACKSL|'1':
+ case BACKSL|'2':
+ case BACKSL|'3':
+ case BACKSL|'4':
+ case BACKSL|'5':
+ case BACKSL|'6':
+ case BACKSL|'7':
+ case BACKSL|'8':
+ case BACKSL|'9':
+ i = (c&~BACKSL) - '0';
+ assert(i < NPAREN);
+ if (p->pend[i] != 0) {
+ assert(i <= p->g->nsub);
+ EMIT(OBACK_, i);
+ assert(p->pbegin[i] != 0);
+ assert(OP(p->strip[p->pbegin[i]]) == OLPAREN);
+ assert(OP(p->strip[p->pend[i]]) == ORPAREN);
+ (void) dupl(p, p->pbegin[i]+1, p->pend[i]);
+ EMIT(O_BACK, i);
+ } else
+ SETERROR(REG_ESUBREG);
+ p->g->backrefs = 1;
+ break;
+ case '*':
+ REQUIRE(starordinary, REG_BADRPT);
+ /* FALLTHROUGH */
+ default:
+ ordinary(p, c &~ BACKSL);
+ break;
+ }
+
+ if (EAT('*')) { /* implemented as +? */
+ /* this case does not require the (y|) trick, noKLUDGE */
+ INSERT(OPLUS_, pos);
+ ASTERN(O_PLUS, pos);
+ INSERT(OQUEST_, pos);
+ ASTERN(O_QUEST, pos);
+ } else if (EATTWO('\\', '{')) {
+ count = p_count(p);
+ if (EAT(',')) {
+ if (MORE() && isdigit(PEEK())) {
+ count2 = p_count(p);
+ REQUIRE(count <= count2, REG_BADBR);
+ } else /* single number with comma */
+ count2 = INFINITY;
+ } else /* just a single number */
+ count2 = count;
+ repeat(p, pos, count, count2);
+ if (!EATTWO('\\', '}')) { /* error heuristics */
+ while (MORE() && !SEETWO('\\', '}'))
+ NEXT1();
+ REQUIRE(MORE(), REG_EBRACE);
+ SETERROR(REG_BADBR);
+ }
+ } else if (c == (unsigned char)'$') /* $ (but not \$) ends it */
+ return(1);
+
+ return(0);
+}
+
+/*
+ - p_count - parse a repetition count
+ == static int p_count(register struct parse *p);
+ */
+static int /* the value */
+p_count(p)
+register struct parse *p;
+{
+ register int count = 0;
+ register int ndigits = 0;
+
+ while (MORE() && isdigit(PEEK()) && count <= DUPMAX) {
+ count = count*10 + (GETNEXT() - '0');
+ ndigits++;
+ }
+
+ REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR);
+ return(count);
+}
+
+/*
+ - p_bracket - parse a bracketed character list
+ == static void p_bracket(register struct parse *p);
+ *
+ * Note a significant property of this code: if the allocset() did SETERROR,
+ * no set operations are done.
+ */
+static void
+p_bracket(p)
+register struct parse *p;
+{
+ register cset *cs = allocset(p);
+ register int invert = 0;
+
+ /* Dept of Truly Sickening Special-Case Kludges */
+ if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]", 6) == 0) {
+ EMIT(OBOW, 0);
+ NEXTn(6);
+ return;
+ }
+ if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]", 6) == 0) {
+ EMIT(OEOW, 0);
+ NEXTn(6);
+ return;
+ }
+
+ if (EAT('^'))
+ invert++; /* make note to invert set at end */
+ if (EAT(']'))
+ CHadd(cs, ']');
+ else if (EAT('-'))
+ CHadd(cs, '-');
+ while (MORE() && PEEK() != ']' && !SEETWO('-', ']'))
+ p_b_term(p, cs);
+ if (EAT('-'))
+ CHadd(cs, '-');
+ MUSTEAT(']', REG_EBRACK);
+
+ if (p->error != 0) /* don't mess things up further */
+ return;
+
+ if (p->g->cflags&REG_ICASE) {
+ register int i;
+ register int ci;
+
+ for (i = p->g->csetsize - 1; i >= 0; i--)
+ if (CHIN(cs, i) && isalpha(i)) {
+ ci = othercase(i);
+ if (ci != i)
+ CHadd(cs, ci);
+ }
+ if (cs->multis != NULL)
+ mccase(p, cs);
+ }
+ if (invert) {
+ register int i;
+
+ for (i = p->g->csetsize - 1; i >= 0; i--)
+ if (CHIN(cs, i))
+ CHsub(cs, i);
+ else
+ CHadd(cs, i);
+ if (p->g->cflags&REG_NEWLINE)
+ CHsub(cs, '\n');
+ if (cs->multis != NULL)
+ mcinvert(p, cs);
+ }
+
+ assert(cs->multis == NULL); /* xxx */
+
+ if (nch(p, cs) == 1) { /* optimize singleton sets */
+ ordinary(p, firstch(p, cs));
+ freeset(p, cs);
+ } else
+ EMIT(OANYOF, freezeset(p, cs));
+}
+
+/*
+ - p_b_term - parse one term of a bracketed character list
+ == static void p_b_term(register struct parse *p, register cset *cs);
+ */
+static void
+p_b_term(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register char c;
+ register char start, finish;
+ register int i;
+
+ /* classify what we've got */
+ switch ((MORE()) ? PEEK() : '\0') {
+ case '[':
+ c = (MORE2()) ? PEEK2() : '\0';
+ break;
+ case '-':
+ SETERROR(REG_ERANGE);
+ return; /* NOTE RETURN */
+ break;
+ default:
+ c = '\0';
+ break;
+ }
+
+ switch (c) {
+ case ':': /* character class */
+ NEXT2();
+ REQUIRE(MORE(), REG_EBRACK);
+ c = PEEK();
+ REQUIRE(c != '-' && c != ']', REG_ECTYPE);
+ p_b_cclass(p, cs);
+ REQUIRE(MORE(), REG_EBRACK);
+ REQUIRE(EATTWO(':', ']'), REG_ECTYPE);
+ break;
+ case '=': /* equivalence class */
+ NEXT2();
+ REQUIRE(MORE(), REG_EBRACK);
+ c = PEEK();
+ REQUIRE(c != '-' && c != ']', REG_ECOLLATE);
+ p_b_eclass(p, cs);
+ REQUIRE(MORE(), REG_EBRACK);
+ REQUIRE(EATTWO('=', ']'), REG_ECOLLATE);
+ break;
+ default: /* symbol, ordinary character, or range */
+/* xxx revision needed for multichar stuff */
+ start = p_b_symbol(p);
+ if (SEE('-') && MORE2() && PEEK2() != ']') {
+ /* range */
+ NEXT1();
+ if (EAT('-'))
+ finish = '-';
+ else
+ finish = p_b_symbol(p);
+ } else
+ finish = start;
+/* xxx what about signed chars here... */
+ REQUIRE(start <= finish, REG_ERANGE);
+ for (i = start; i <= finish; i++)
+ CHadd(cs, i);
+ break;
+ }
+}
+
+/*
+ - p_b_cclass - parse a character-class name and deal with it
+ == static void p_b_cclass(register struct parse *p, register cset *cs);
+ */
+static void
+p_b_cclass(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register char *sp = p->next;
+ register struct cclass *cp;
+ register size_t len;
+ register char *u;
+ register char c;
+
+ while (MORE() && isalpha(PEEK()))
+ NEXT1();
+ len = p->next - sp;
+ for (cp = cclasses; cp->name != NULL; cp++)
+ if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
+ break;
+ if (cp->name == NULL) {
+ /* oops, didn't find it */
+ SETERROR(REG_ECTYPE);
+ return;
+ }
+
+ u = cp->chars;
+ while ((c = *u++) != '\0')
+ CHadd(cs, c);
+ for (u = cp->multis; *u != '\0'; u += strlen(u) + 1)
+ MCadd(p, cs, u);
+}
+
+/*
+ - p_b_eclass - parse an equivalence-class name and deal with it
+ == static void p_b_eclass(register struct parse *p, register cset *cs);
+ *
+ * This implementation is incomplete. xxx
+ */
+static void
+p_b_eclass(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register char c;
+
+ c = p_b_coll_elem(p, '=');
+ CHadd(cs, c);
+}
+
+/*
+ - p_b_symbol - parse a character or [..]ed multicharacter collating symbol
+ == static char p_b_symbol(register struct parse *p);
+ */
+static char /* value of symbol */
+p_b_symbol(p)
+register struct parse *p;
+{
+ register char value;
+
+ REQUIRE(MORE(), REG_EBRACK);
+ if (!EATTWO('[', '.'))
+ return(GETNEXT());
+
+ /* collating symbol */
+ value = p_b_coll_elem(p, '.');
+ REQUIRE(EATTWO('.', ']'), REG_ECOLLATE);
+ return(value);
+}
+
+/*
+ - p_b_coll_elem - parse a collating-element name and look it up
+ == static char p_b_coll_elem(register struct parse *p, int endc);
+ */
+static char /* value of collating element */
+p_b_coll_elem(p, endc)
+register struct parse *p;
+int endc; /* name ended by endc,']' */
+{
+ register char *sp = p->next;
+ register struct cname *cp;
+ register int len;
+
+ while (MORE() && !SEETWO(endc, ']'))
+ NEXT1();
+ if (!MORE()) {
+ SETERROR(REG_EBRACK);
+ return(0);
+ }
+ len = p->next - sp;
+ for (cp = cnames; cp->name != NULL; cp++)
+ if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
+ return(cp->code); /* known name */
+ if (len == 1)
+ return(*sp); /* single character */
+ SETERROR(REG_ECOLLATE); /* neither */
+ return(0);
+}
+
+/*
+ - othercase - return the case counterpart of an alphabetic
+ == static char othercase(int ch);
+ */
+static char /* if no counterpart, return ch */
+othercase(ch)
+int ch;
+{
+ assert(isalpha(ch));
+ if (isupper(ch))
+ return(tolower(ch));
+ else if (islower(ch))
+ return(toupper(ch));
+ else /* peculiar, but could happen */
+ return(ch);
+}
+
+/*
+ - bothcases - emit a dualcase version of a two-case character
+ == static void bothcases(register struct parse *p, int ch);
+ *
+ * Boy, is this implementation ever a kludge...
+ */
+static void
+bothcases(p, ch)
+register struct parse *p;
+int ch;
+{
+ register char *oldnext = p->next;
+ register char *oldend = p->end;
+ char bracket[3];
+
+ assert(othercase(ch) != ch); /* p_bracket() would recurse */
+ p->next = bracket;
+ p->end = bracket+2;
+ bracket[0] = ch;
+ bracket[1] = ']';
+ bracket[2] = '\0';
+ p_bracket(p);
+ assert(p->next == bracket+2);
+ p->next = oldnext;
+ p->end = oldend;
+}
+
+/*
+ - ordinary - emit an ordinary character
+ == static void ordinary(register struct parse *p, register int ch);
+ */
+static void
+ordinary(p, ch)
+register struct parse *p;
+register int ch;
+{
+ register cat_t *cap = p->g->categories;
+
+ if ((p->g->cflags&REG_ICASE) && isalpha(ch) && othercase(ch) != ch)
+ bothcases(p, ch);
+ else {
+ EMIT(OCHAR, (unsigned char)ch);
+ if (cap[ch] == 0)
+ cap[ch] = p->g->ncategories++;
+ }
+}
+
+/*
+ - nonnewline - emit REG_NEWLINE version of OANY
+ == static void nonnewline(register struct parse *p);
+ *
+ * Boy, is this implementation ever a kludge...
+ */
+static void
+nonnewline(p)
+register struct parse *p;
+{
+ register char *oldnext = p->next;
+ register char *oldend = p->end;
+ char bracket[4];
+
+ p->next = bracket;
+ p->end = bracket+3;
+ bracket[0] = '^';
+ bracket[1] = '\n';
+ bracket[2] = ']';
+ bracket[3] = '\0';
+ p_bracket(p);
+ assert(p->next == bracket+3);
+ p->next = oldnext;
+ p->end = oldend;
+}
+
+/*
+ - repeat - generate code for a bounded repetition, recursively if needed
+ == static void repeat(register struct parse *p, sopno start, int from, int to);
+ */
+static void
+repeat(p, start, from, to)
+register struct parse *p;
+sopno start; /* operand from here to end of strip */
+int from; /* repeated from this number */
+int to; /* to this number of times (maybe INFINITY) */
+{
+ register sopno finish = HERE();
+# define N 2
+# define INF 3
+# define REP(f, t) ((f)*8 + (t))
+# define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N)
+ register sopno copy;
+
+ if (p->error != 0) /* head off possible runaway recursion */
+ return;
+
+ assert(from <= to);
+
+ switch (REP(MAP(from), MAP(to))) {
+ case REP(0, 0): /* must be user doing this */
+ DROP(finish-start); /* drop the operand */
+ break;
+ case REP(0, 1): /* as x{1,1}? */
+ case REP(0, N): /* as x{1,n}? */
+ case REP(0, INF): /* as x{1,}? */
+ /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
+ INSERT(OCH_, start); /* offset is wrong... */
+ repeat(p, start+1, 1, to);
+ ASTERN(OOR1, start);
+ AHEAD(start); /* ... fix it */
+ EMIT(OOR2, 0);
+ AHEAD(THERE());
+ ASTERN(O_CH, THERETHERE());
+ break;
+ case REP(1, 1): /* trivial case */
+ /* done */
+ break;
+ case REP(1, N): /* as x?x{1,n-1} */
+ /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
+ INSERT(OCH_, start);
+ ASTERN(OOR1, start);
+ AHEAD(start);
+ EMIT(OOR2, 0); /* offset very wrong... */
+ AHEAD(THERE()); /* ...so fix it */
+ ASTERN(O_CH, THERETHERE());
+ copy = dupl(p, start+1, finish+1);
+ assert(copy == finish+4);
+ repeat(p, copy, 1, to-1);
+ break;
+ case REP(1, INF): /* as x+ */
+ INSERT(OPLUS_, start);
+ ASTERN(O_PLUS, start);
+ break;
+ case REP(N, N): /* as xx{m-1,n-1} */
+ copy = dupl(p, start, finish);
+ repeat(p, copy, from-1, to-1);
+ break;
+ case REP(N, INF): /* as xx{n-1,INF} */
+ copy = dupl(p, start, finish);
+ repeat(p, copy, from-1, to);
+ break;
+ default: /* "can't happen" */
+ SETERROR(REG_ASSERT); /* just in case */
+ break;
+ }
+}
+
+/*
+ - seterr - set an error condition
+ == static int seterr(register struct parse *p, int e);
+ */
+static int /* useless but makes type checking happy */
+seterr(p, e)
+register struct parse *p;
+int e;
+{
+ if (p->error == 0) /* keep earliest error condition */
+ p->error = e;
+ p->next = nuls; /* try to bring things to a halt */
+ p->end = nuls;
+ return(0); /* make the return value well-defined */
+}
+
+/*
+ - allocset - allocate a set of characters for []
+ == static cset *allocset(register struct parse *p);
+ */
+static cset *
+allocset(p)
+register struct parse *p;
+{
+ register int no = p->g->ncsets++;
+ register size_t nc;
+ register size_t nbytes;
+ register cset *cs;
+ register size_t css = (size_t)p->g->csetsize;
+ register int i;
+
+ if (no >= p->ncsalloc) { /* need another column of space */
+ p->ncsalloc += CHAR_BIT;
+ nc = p->ncsalloc;
+ assert(nc % CHAR_BIT == 0);
+ nbytes = nc / CHAR_BIT * css;
+ if (p->g->sets == NULL)
+ p->g->sets = (cset *)malloc(nc * sizeof(cset));
+ else
+ p->g->sets = (cset *)realloc((char *)p->g->sets,
+ nc * sizeof(cset));
+ if (p->g->setbits == NULL)
+ p->g->setbits = (uch *)malloc(nbytes);
+ else {
+ p->g->setbits = (uch *)realloc((char *)p->g->setbits,
+ nbytes);
+ /* xxx this isn't right if setbits is now NULL */
+ for (i = 0; i < no; i++)
+ p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT);
+ }
+ if (p->g->sets != NULL && p->g->setbits != NULL)
+ (void) memset((char *)p->g->setbits + (nbytes - css),
+ 0, css);
+ else {
+ no = 0;
+ SETERROR(REG_ESPACE);
+ /* caller's responsibility not to do set ops */
+ }
+ }
+
+ assert(p->g->sets != NULL); /* xxx */
+ cs = &p->g->sets[no];
+ cs->ptr = p->g->setbits + css*((no)/CHAR_BIT);
+ cs->mask = 1 << ((no) % CHAR_BIT);
+ cs->hash = 0;
+ cs->smultis = 0;
+ cs->multis = NULL;
+
+ return(cs);
+}
+
+/*
+ - freeset - free a now-unused set
+ == static void freeset(register struct parse *p, register cset *cs);
+ */
+static void
+freeset(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register unsigned int i;
+ register cset *top = &p->g->sets[p->g->ncsets];
+ register size_t css = (size_t)p->g->csetsize;
+
+ for (i = 0; i < css; i++)
+ CHsub(cs, i);
+ if (cs == top-1) /* recover only the easy case */
+ p->g->ncsets--;
+}
+
+/*
+ - freezeset - final processing on a set of characters
+ == static int freezeset(register struct parse *p, register cset *cs);
+ *
+ * The main task here is merging identical sets. This is usually a waste
+ * of time (although the hash code minimizes the overhead), but can win
+ * big if REG_ICASE is being used. REG_ICASE, by the way, is why the hash
+ * is done using addition rather than xor -- all ASCII [aA] sets xor to
+ * the same value!
+ */
+static int /* set number */
+freezeset(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register uch h = cs->hash;
+ register unsigned int i;
+ register cset *top = &p->g->sets[p->g->ncsets];
+ register cset *cs2;
+ register size_t css = (size_t)p->g->csetsize;
+
+ /* look for an earlier one which is the same */
+ for (cs2 = &p->g->sets[0]; cs2 < top; cs2++)
+ if (cs2->hash == h && cs2 != cs) {
+ /* maybe */
+ for (i = 0; i < css; i++)
+ if (!!CHIN(cs2, i) != !!CHIN(cs, i))
+ break; /* no */
+ if (i == css)
+ break; /* yes */
+ }
+
+ if (cs2 < top) { /* found one */
+ freeset(p, cs);
+ cs = cs2;
+ }
+
+ return((int)(cs - p->g->sets));
+}
+
+/*
+ - firstch - return first character in a set (which must have at least one)
+ == static int firstch(register struct parse *p, register cset *cs);
+ */
+static int /* character; there is no "none" value */
+firstch(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register unsigned int i;
+ register size_t css = (size_t)p->g->csetsize;
+
+ for (i = 0; i < css; i++)
+ if (CHIN(cs, i))
+ return((char)i);
+ assert(never);
+ return(0); /* arbitrary */
+}
+
+/*
+ - nch - number of characters in a set
+ == static int nch(register struct parse *p, register cset *cs);
+ */
+static int
+nch(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register unsigned int i;
+ register size_t css = (size_t)p->g->csetsize;
+ register int n = 0;
+
+ for (i = 0; i < css; i++)
+ if (CHIN(cs, i))
+ n++;
+ return(n);
+}
+
+/*
+ - mcadd - add a collating element to a cset
+ == static void mcadd(register struct parse *p, register cset *cs, \
+ == register char *cp);
+ */
+static void
+mcadd(p, cs, cp)
+register struct parse *p;
+register cset *cs;
+register char *cp;
+{
+ register size_t oldend = cs->smultis;
+
+ cs->smultis += strlen(cp) + 1;
+ if (cs->multis == NULL)
+ cs->multis = malloc(cs->smultis);
+ else
+ cs->multis = realloc(cs->multis, cs->smultis);
+ if (cs->multis == NULL) {
+ SETERROR(REG_ESPACE);
+ return;
+ }
+
+ (void) strcpy(cs->multis + oldend - 1, cp);
+ cs->multis[cs->smultis - 1] = '\0';
+}
+
+
+/*
+ - mcinvert - invert the list of collating elements in a cset
+ == static void mcinvert(register struct parse *p, register cset *cs);
+ *
+ * This would have to know the set of possibilities. Implementation
+ * is deferred.
+ */
+static void
+mcinvert(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ assert(cs->multis == NULL); /* xxx */
+}
+
+/*
+ - mccase - add case counterparts of the list of collating elements in a cset
+ == static void mccase(register struct parse *p, register cset *cs);
+ *
+ * This would have to know the set of possibilities. Implementation
+ * is deferred.
+ */
+static void
+mccase(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ assert(cs->multis == NULL); /* xxx */
+}
+
+/*
+ - isinsets - is this character in any sets?
+ == static int isinsets(register struct re_guts *g, int c);
+ */
+static int /* predicate */
+isinsets(g, c)
+register struct re_guts *g;
+int c;
+{
+ register uch *col;
+ register int i;
+ register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
+ register unsigned uc = (unsigned char)c;
+
+ for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
+ if (col[uc] != 0)
+ return(1);
+ return(0);
+}
+
+/*
+ - samesets - are these two characters in exactly the same sets?
+ == static int samesets(register struct re_guts *g, int c1, int c2);
+ */
+static int /* predicate */
+samesets(g, c1, c2)
+register struct re_guts *g;
+int c1;
+int c2;
+{
+ register uch *col;
+ register int i;
+ register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
+ register unsigned uc1 = (unsigned char)c1;
+ register unsigned uc2 = (unsigned char)c2;
+
+ for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
+ if (col[uc1] != col[uc2])
+ return(0);
+ return(1);
+}
+
+/*
+ - categorize - sort out character categories
+ == static void categorize(struct parse *p, register struct re_guts *g);
+ */
+static void
+categorize(p, g)
+struct parse *p;
+register struct re_guts *g;
+{
+ register cat_t *cats = g->categories;
+ register int c;
+ register int c2;
+ register cat_t cat;
+
+ /* avoid making error situations worse */
+ if (p->error != 0)
+ return;
+
+ for (c = CHAR_MIN; c <= CHAR_MAX; c++)
+ if (cats[c] == 0 && isinsets(g, c)) {
+ cat = g->ncategories++;
+ cats[c] = cat;
+ for (c2 = c+1; c2 <= CHAR_MAX; c2++)
+ if (cats[c2] == 0 && samesets(g, c, c2))
+ cats[c2] = cat;
+ }
+}
+
+/*
+ - dupl - emit a duplicate of a bunch of sops
+ == static sopno dupl(register struct parse *p, sopno start, sopno finish);
+ */
+static sopno /* start of duplicate */
+dupl(p, start, finish)
+register struct parse *p;
+sopno start; /* from here */
+sopno finish; /* to this less one */
+{
+ register sopno ret = HERE();
+ register sopno len = finish - start;
+
+ assert(finish >= start);
+ if (len == 0)
+ return(ret);
+ enlarge(p, p->ssize + len); /* this many unexpected additions */
+ assert(p->ssize >= p->slen + len);
+ (void) memcpy((char *)(p->strip + p->slen),
+ (char *)(p->strip + start), (size_t)len*sizeof(sop));
+ p->slen += len;
+ return(ret);
+}
+
+/*
+ - doemit - emit a strip operator
+ == static void doemit(register struct parse *p, sop op, size_t opnd);
+ *
+ * It might seem better to implement this as a macro with a function as
+ * hard-case backup, but it's just too big and messy unless there are
+ * some changes to the data structures. Maybe later.
+ */
+static void
+doemit(p, op, opnd)
+register struct parse *p;
+sop op;
+size_t opnd;
+{
+ /* avoid making error situations worse */
+ if (p->error != 0)
+ return;
+
+ /* deal with oversize operands ("can't happen", more or less) */
+ assert(opnd < 1<<OPSHIFT);
+
+ /* deal with undersized strip */
+ if (p->slen >= p->ssize)
+ enlarge(p, (p->ssize+1) / 2 * 3); /* +50% */
+ assert(p->slen < p->ssize);
+
+ /* finally, it's all reduced to the easy case */
+ p->strip[p->slen++] = SOP(op, opnd);
+}
+
+/*
+ - doinsert - insert a sop into the strip
+ == static void doinsert(register struct parse *p, sop op, size_t opnd, sopno pos);
+ */
+static void
+doinsert(p, op, opnd, pos)
+register struct parse *p;
+sop op;
+size_t opnd;
+sopno pos;
+{
+ register sopno sn;
+ register sop s;
+ register int i;
+
+ /* avoid making error situations worse */
+ if (p->error != 0)
+ return;
+
+ sn = HERE();
+ EMIT(op, opnd); /* do checks, ensure space */
+ assert(HERE() == sn+1);
+ s = p->strip[sn];
+
+ /* adjust paren pointers */
+ assert(pos > 0);
+ for (i = 1; i < NPAREN; i++) {
+ if (p->pbegin[i] >= pos) {
+ p->pbegin[i]++;
+ }
+ if (p->pend[i] >= pos) {
+ p->pend[i]++;
+ }
+ }
+
+ memmove((char *)&p->strip[pos+1], (char *)&p->strip[pos],
+ (HERE()-pos-1)*sizeof(sop));
+ p->strip[pos] = s;
+}
+
+/*
+ - dofwd - complete a forward reference
+ == static void dofwd(register struct parse *p, sopno pos, sop value);
+ */
+static void
+dofwd(p, pos, value)
+register struct parse *p;
+register sopno pos;
+sop value;
+{
+ /* avoid making error situations worse */
+ if (p->error != 0)
+ return;
+
+ assert(value < 1<<OPSHIFT);
+ p->strip[pos] = OP(p->strip[pos]) | value;
+}
+
+/*
+ - enlarge - enlarge the strip
+ == static void enlarge(register struct parse *p, sopno size);
+ */
+static void
+enlarge(p, size)
+register struct parse *p;
+register sopno size;
+{
+ register sop *sp;
+
+ if (p->ssize >= size)
+ return;
+
+ sp = (sop *)realloc(p->strip, size*sizeof(sop));
+ if (sp == NULL) {
+ SETERROR(REG_ESPACE);
+ return;
+ }
+ p->strip = sp;
+ p->ssize = size;
+}
+
+/*
+ - stripsnug - compact the strip
+ == static void stripsnug(register struct parse *p, register struct re_guts *g);
+ */
+static void
+stripsnug(p, g)
+register struct parse *p;
+register struct re_guts *g;
+{
+ g->nstates = p->slen;
+ g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop));
+ if (g->strip == NULL) {
+ SETERROR(REG_ESPACE);
+ g->strip = p->strip;
+ }
+}
+
+/*
+ - findmust - fill in must and mlen with longest mandatory literal string
+ == static void findmust(register struct parse *p, register struct re_guts *g);
+ *
+ * This algorithm could do fancy things like analyzing the operands of |
+ * for common subsequences. Someday. This code is simple and finds most
+ * of the interesting cases.
+ *
+ * Note that must and mlen got initialized during setup.
+ */
+static void
+findmust(p, g)
+struct parse *p;
+register struct re_guts *g;
+{
+ register sop *scan;
+ sop *start = NULL;
+ register sop *newstart = NULL;
+ register sopno newlen;
+ register sop s;
+ register char *cp;
+ register sopno i;
+
+ /* avoid making error situations worse */
+ if (p->error != 0)
+ return;
+
+ /* find the longest OCHAR sequence in strip */
+ newlen = 0;
+ scan = g->strip + 1;
+ do {
+ s = *scan++;
+ switch (OP(s)) {
+ case OCHAR: /* sequence member */
+ if (newlen == 0) /* new sequence */
+ newstart = scan - 1;
+ newlen++;
+ break;
+ case OPLUS_: /* things that don't break one */
+ case OLPAREN:
+ case ORPAREN:
+ break;
+ case OQUEST_: /* things that must be skipped */
+ case OCH_:
+ scan--;
+ do {
+ scan += OPND(s);
+ s = *scan;
+ /* assert() interferes w debug printouts */
+ if (OP(s) != O_QUEST && OP(s) != O_CH &&
+ OP(s) != OOR2) {
+ g->iflags |= BAD;
+ return;
+ }
+ } while (OP(s) != O_QUEST && OP(s) != O_CH);
+ /* fallthrough */
+ default: /* things that break a sequence */
+ if (newlen > g->mlen) { /* ends one */
+ start = newstart;
+ g->mlen = newlen;
+ }
+ newlen = 0;
+ break;
+ }
+ } while (OP(s) != OEND);
+
+ if (g->mlen == 0) /* there isn't one */
+ return;
+
+ /* turn it into a character string */
+ g->must = malloc((size_t)g->mlen + 1);
+ if (g->must == NULL) { /* argh; just forget it */
+ g->mlen = 0;
+ return;
+ }
+ cp = g->must;
+ scan = start;
+ for (i = g->mlen; i > 0; i--) {
+ while (OP(s = *scan++) != OCHAR)
+ continue;
+ assert(cp < g->must + g->mlen);
+ *cp++ = (char)OPND(s);
+ }
+ assert(cp == g->must + g->mlen);
+ *cp++ = '\0'; /* just on general principles */
+}
+
+/*
+ - pluscount - count + nesting
+ == static sopno pluscount(register struct parse *p, register struct re_guts *g);
+ */
+static sopno /* nesting depth */
+pluscount(p, g)
+struct parse *p;
+register struct re_guts *g;
+{
+ register sop *scan;
+ register sop s;
+ register sopno plusnest = 0;
+ register sopno maxnest = 0;
+
+ if (p->error != 0)
+ return(0); /* there may not be an OEND */
+
+ scan = g->strip + 1;
+ do {
+ s = *scan++;
+ switch (OP(s)) {
+ case OPLUS_:
+ plusnest++;
+ break;
+ case O_PLUS:
+ if (plusnest > maxnest)
+ maxnest = plusnest;
+ plusnest--;
+ break;
+ }
+ } while (OP(s) != OEND);
+ if (plusnest != 0)
+ g->iflags |= BAD;
+ return(maxnest);
+}
diff --git a/ext/ereg/regex/regerror.c b/ext/ereg/regex/regerror.c
new file mode 100644
index 0000000..12edd4e
--- /dev/null
+++ b/ext/ereg/regex/regerror.c
@@ -0,0 +1,124 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regerror.ih"
+
+/*
+ = #define REG_NOMATCH 1
+ = #define REG_BADPAT 2
+ = #define REG_ECOLLATE 3
+ = #define REG_ECTYPE 4
+ = #define REG_EESCAPE 5
+ = #define REG_ESUBREG 6
+ = #define REG_EBRACK 7
+ = #define REG_EPAREN 8
+ = #define REG_EBRACE 9
+ = #define REG_BADBR 10
+ = #define REG_ERANGE 11
+ = #define REG_ESPACE 12
+ = #define REG_BADRPT 13
+ = #define REG_EMPTY 14
+ = #define REG_ASSERT 15
+ = #define REG_INVARG 16
+ = #define REG_ATOI 255 // convert name to number (!)
+ = #define REG_ITOA 0400 // convert number to name (!)
+ */
+static struct rerr {
+ int code;
+ char *name;
+ char *explain;
+} rerrs[] = {
+ { REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match" },
+ { REG_BADPAT, "REG_BADPAT", "invalid regular expression" },
+ { REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element" },
+ { REG_ECTYPE, "REG_ECTYPE", "invalid character class" },
+ { REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)" },
+ { REG_ESUBREG, "REG_ESUBREG", "invalid backreference number" },
+ { REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced" },
+ { REG_EPAREN, "REG_EPAREN", "parentheses not balanced" },
+ { REG_EBRACE, "REG_EBRACE", "braces not balanced" },
+ { REG_BADBR, "REG_BADBR", "invalid repetition count(s)" },
+ { REG_ERANGE, "REG_ERANGE", "invalid character range" },
+ { REG_ESPACE, "REG_ESPACE", "out of memory" },
+ { REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid" },
+ { REG_EMPTY, "REG_EMPTY", "empty (sub)expression" },
+ { REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug" },
+ { REG_INVARG, "REG_INVARG", "invalid argument to regex routine" },
+ { 0, "", "*** unknown regexp error code ***" }
+};
+
+/*
+ - regerror - the interface to error numbers
+ = API_EXPORT(size_t) regerror(int, const regex_t *, char *, size_t);
+ */
+/* ARGSUSED */
+API_EXPORT(size_t)
+regerror(errcode, preg, errbuf, errbuf_size)
+int errcode;
+const regex_t *preg;
+char *errbuf;
+size_t errbuf_size;
+{
+ register struct rerr *r;
+ register size_t len;
+ register int target = errcode &~ REG_ITOA;
+ register char *s;
+ char convbuf[50];
+
+ if (errcode == REG_ATOI)
+ s = regatoi(preg, convbuf);
+ else {
+ for (r = rerrs; r->code != 0; r++)
+ if (r->code == target)
+ break;
+
+ if (errcode&REG_ITOA) {
+ if (r->code != 0)
+ (void) strcpy(convbuf, r->name);
+ else
+ sprintf(convbuf, "REG_0x%x", target);
+ assert(strlen(convbuf) < sizeof(convbuf));
+ s = convbuf;
+ } else
+ s = r->explain;
+ }
+
+ len = strlen(s) + 1;
+ if (errbuf_size > 0) {
+ if (errbuf_size > len)
+ (void) strcpy(errbuf, s);
+ else {
+ (void) strncpy(errbuf, s, errbuf_size-1);
+ errbuf[errbuf_size-1] = '\0';
+ }
+ }
+
+ return(len);
+}
+
+/*
+ - regatoi - internal routine to implement REG_ATOI
+ == static char *regatoi(const regex_t *preg, char *localbuf);
+ */
+static char *
+regatoi(preg, localbuf)
+const regex_t *preg;
+char *localbuf;
+{
+ register struct rerr *r;
+
+ for (r = rerrs; r->code != 0; r++)
+ if (strcmp(r->name, preg->re_endp) == 0)
+ break;
+ if (r->code == 0)
+ return("0");
+
+ sprintf(localbuf, "%d", r->code);
+ return(localbuf);
+}
diff --git a/ext/ereg/regex/regex.3 b/ext/ereg/regex/regex.3
new file mode 100644
index 0000000..100c8a7
--- /dev/null
+++ b/ext/ereg/regex/regex.3
@@ -0,0 +1,502 @@
+.TH REGEX 3 "17 May 1993"
+.BY "Henry Spencer"
+.de ZR
+.\" one other place knows this name: the SEE ALSO section
+.IR regex (7) \\$1
+..
+.SH NAME
+regcomp, regexec, regerror, regfree \- regular-expression library
+.SH SYNOPSIS
+.ft B
+.\".na
+#include <sys/types.h>
+.br
+#include <regex.h>
+.HP 10
+int regcomp(regex_t\ *preg, const\ char\ *pattern, int\ cflags);
+.HP
+int\ regexec(const\ regex_t\ *preg, const\ char\ *string,
+size_t\ nmatch, regmatch_t\ pmatch[], int\ eflags);
+.HP
+size_t\ regerror(int\ errcode, const\ regex_t\ *preg,
+char\ *errbuf, size_t\ errbuf_size);
+.HP
+void\ regfree(regex_t\ *preg);
+.\".ad
+.ft
+.SH DESCRIPTION
+These routines implement POSIX 1003.2 regular expressions (``RE''s);
+see
+.ZR .
+.I Regcomp
+compiles an RE written as a string into an internal form,
+.I regexec
+matches that internal form against a string and reports results,
+.I regerror
+transforms error codes from either into human-readable messages,
+and
+.I regfree
+frees any dynamically-allocated storage used by the internal form
+of an RE.
+.PP
+The header
+.I <regex.h>
+declares two structure types,
+.I regex_t
+and
+.IR regmatch_t ,
+the former for compiled internal forms and the latter for match reporting.
+It also declares the four functions,
+a type
+.IR regoff_t ,
+and a number of constants with names starting with ``REG_''.
+.PP
+.I Regcomp
+compiles the regular expression contained in the
+.I pattern
+string,
+subject to the flags in
+.IR cflags ,
+and places the results in the
+.I regex_t
+structure pointed to by
+.IR preg .
+.I Cflags
+is the bitwise OR of zero or more of the following flags:
+.IP REG_EXTENDED \w'REG_EXTENDED'u+2n
+Compile modern (``extended'') REs,
+rather than the obsolete (``basic'') REs that
+are the default.
+.IP REG_BASIC
+This is a synonym for 0,
+provided as a counterpart to REG_EXTENDED to improve readability.
+.IP REG_NOSPEC
+Compile with recognition of all special characters turned off.
+All characters are thus considered ordinary,
+so the ``RE'' is a literal string.
+This is an extension,
+compatible with but not specified by POSIX 1003.2,
+and should be used with
+caution in software intended to be portable to other systems.
+REG_EXTENDED and REG_NOSPEC may not be used
+in the same call to
+.IR regcomp .
+.IP REG_ICASE
+Compile for matching that ignores upper/lower case distinctions.
+See
+.ZR .
+.IP REG_NOSUB
+Compile for matching that need only report success or failure,
+not what was matched.
+.IP REG_NEWLINE
+Compile for newline-sensitive matching.
+By default, newline is a completely ordinary character with no special
+meaning in either REs or strings.
+With this flag,
+`[^' bracket expressions and `.' never match newline,
+a `^' anchor matches the null string after any newline in the string
+in addition to its normal function,
+and the `$' anchor matches the null string before any newline in the
+string in addition to its normal function.
+.IP REG_PEND
+The regular expression ends,
+not at the first NUL,
+but just before the character pointed to by the
+.I re_endp
+member of the structure pointed to by
+.IR preg .
+The
+.I re_endp
+member is of type
+.IR const\ char\ * .
+This flag permits inclusion of NULs in the RE;
+they are considered ordinary characters.
+This is an extension,
+compatible with but not specified by POSIX 1003.2,
+and should be used with
+caution in software intended to be portable to other systems.
+.PP
+When successful,
+.I regcomp
+returns 0 and fills in the structure pointed to by
+.IR preg .
+One member of that structure
+(other than
+.IR re_endp )
+is publicized:
+.IR re_nsub ,
+of type
+.IR size_t ,
+contains the number of parenthesized subexpressions within the RE
+(except that the value of this member is undefined if the
+REG_NOSUB flag was used).
+If
+.I regcomp
+fails, it returns a non-zero error code;
+see DIAGNOSTICS.
+.PP
+.I Regexec
+matches the compiled RE pointed to by
+.I preg
+against the
+.IR string ,
+subject to the flags in
+.IR eflags ,
+and reports results using
+.IR nmatch ,
+.IR pmatch ,
+and the returned value.
+The RE must have been compiled by a previous invocation of
+.IR regcomp .
+The compiled form is not altered during execution of
+.IR regexec ,
+so a single compiled RE can be used simultaneously by multiple threads.
+.PP
+By default,
+the NUL-terminated string pointed to by
+.I string
+is considered to be the text of an entire line, minus any terminating
+newline.
+The
+.I eflags
+argument is the bitwise OR of zero or more of the following flags:
+.IP REG_NOTBOL \w'REG_STARTEND'u+2n
+The first character of
+the string
+is not the beginning of a line, so the `^' anchor should not match before it.
+This does not affect the behavior of newlines under REG_NEWLINE.
+.IP REG_NOTEOL
+The NUL terminating
+the string
+does not end a line, so the `$' anchor should not match before it.
+This does not affect the behavior of newlines under REG_NEWLINE.
+.IP REG_STARTEND
+The string is considered to start at
+\fIstring\fR\ + \fIpmatch\fR[0].\fIrm_so\fR
+and to have a terminating NUL located at
+\fIstring\fR\ + \fIpmatch\fR[0].\fIrm_eo\fR
+(there need not actually be a NUL at that location),
+regardless of the value of
+.IR nmatch .
+See below for the definition of
+.IR pmatch
+and
+.IR nmatch .
+This is an extension,
+compatible with but not specified by POSIX 1003.2,
+and should be used with
+caution in software intended to be portable to other systems.
+Note that a non-zero \fIrm_so\fR does not imply REG_NOTBOL;
+REG_STARTEND affects only the location of the string,
+not how it is matched.
+.PP
+See
+.ZR
+for a discussion of what is matched in situations where an RE or a
+portion thereof could match any of several substrings of
+.IR string .
+.PP
+Normally,
+.I regexec
+returns 0 for success and the non-zero code REG_NOMATCH for failure.
+Other non-zero error codes may be returned in exceptional situations;
+see DIAGNOSTICS.
+.PP
+If REG_NOSUB was specified in the compilation of the RE,
+or if
+.I nmatch
+is 0,
+.I regexec
+ignores the
+.I pmatch
+argument (but see below for the case where REG_STARTEND is specified).
+Otherwise,
+.I pmatch
+points to an array of
+.I nmatch
+structures of type
+.IR regmatch_t .
+Such a structure has at least the members
+.I rm_so
+and
+.IR rm_eo ,
+both of type
+.I regoff_t
+(a signed arithmetic type at least as large as an
+.I off_t
+and a
+.IR ssize_t ),
+containing respectively the offset of the first character of a substring
+and the offset of the first character after the end of the substring.
+Offsets are measured from the beginning of the
+.I string
+argument given to
+.IR regexec .
+An empty substring is denoted by equal offsets,
+both indicating the character following the empty substring.
+.PP
+The 0th member of the
+.I pmatch
+array is filled in to indicate what substring of
+.I string
+was matched by the entire RE.
+Remaining members report what substring was matched by parenthesized
+subexpressions within the RE;
+member
+.I i
+reports subexpression
+.IR i ,
+with subexpressions counted (starting at 1) by the order of their opening
+parentheses in the RE, left to right.
+Unused entries in the array\(emcorresponding either to subexpressions that
+did not participate in the match at all, or to subexpressions that do not
+exist in the RE (that is, \fIi\fR\ > \fIpreg\fR\->\fIre_nsub\fR)\(emhave both
+.I rm_so
+and
+.I rm_eo
+set to \-1.
+If a subexpression participated in the match several times,
+the reported substring is the last one it matched.
+(Note, as an example in particular, that when the RE `(b*)+' matches `bbb',
+the parenthesized subexpression matches each of the three `b's and then
+an infinite number of empty strings following the last `b',
+so the reported substring is one of the empties.)
+.PP
+If REG_STARTEND is specified,
+.I pmatch
+must point to at least one
+.I regmatch_t
+(even if
+.I nmatch
+is 0 or REG_NOSUB was specified),
+to hold the input offsets for REG_STARTEND.
+Use for output is still entirely controlled by
+.IR nmatch ;
+if
+.I nmatch
+is 0 or REG_NOSUB was specified,
+the value of
+.IR pmatch [0]
+will not be changed by a successful
+.IR regexec .
+.PP
+.I Regerror
+maps a non-zero
+.I errcode
+from either
+.I regcomp
+or
+.I regexec
+to a human-readable, printable message.
+If
+.I preg
+is non-NULL,
+the error code should have arisen from use of
+the
+.I regex_t
+pointed to by
+.IR preg ,
+and if the error code came from
+.IR regcomp ,
+it should have been the result from the most recent
+.I regcomp
+using that
+.IR regex_t .
+.RI ( Regerror
+may be able to supply a more detailed message using information
+from the
+.IR regex_t .)
+.I Regerror
+places the NUL-terminated message into the buffer pointed to by
+.IR errbuf ,
+limiting the length (including the NUL) to at most
+.I errbuf_size
+bytes.
+If the whole message won't fit,
+as much of it as will fit before the terminating NUL is supplied.
+In any case,
+the returned value is the size of buffer needed to hold the whole
+message (including terminating NUL).
+If
+.I errbuf_size
+is 0,
+.I errbuf
+is ignored but the return value is still correct.
+.PP
+If the
+.I errcode
+given to
+.I regerror
+is first ORed with REG_ITOA,
+the ``message'' that results is the printable name of the error code,
+e.g. ``REG_NOMATCH'',
+rather than an explanation thereof.
+If
+.I errcode
+is REG_ATOI,
+then
+.I preg
+shall be non-NULL and the
+.I re_endp
+member of the structure it points to
+must point to the printable name of an error code;
+in this case, the result in
+.I errbuf
+is the decimal digits of
+the numeric value of the error code
+(0 if the name is not recognized).
+REG_ITOA and REG_ATOI are intended primarily as debugging facilities;
+they are extensions,
+compatible with but not specified by POSIX 1003.2,
+and should be used with
+caution in software intended to be portable to other systems.
+Be warned also that they are considered experimental and changes are possible.
+.PP
+.I Regfree
+frees any dynamically-allocated storage associated with the compiled RE
+pointed to by
+.IR preg .
+The remaining
+.I regex_t
+is no longer a valid compiled RE
+and the effect of supplying it to
+.I regexec
+or
+.I regerror
+is undefined.
+.PP
+None of these functions references global variables except for tables
+of constants;
+all are safe for use from multiple threads if the arguments are safe.
+.SH IMPLEMENTATION CHOICES
+There are a number of decisions that 1003.2 leaves up to the implementor,
+either by explicitly saying ``undefined'' or by virtue of them being
+forbidden by the RE grammar.
+This implementation treats them as follows.
+.PP
+See
+.ZR
+for a discussion of the definition of case-independent matching.
+.PP
+There is no particular limit on the length of REs,
+except insofar as memory is limited.
+Memory usage is approximately linear in RE size, and largely insensitive
+to RE complexity, except for bounded repetitions.
+See BUGS for one short RE using them
+that will run almost any system out of memory.
+.PP
+A backslashed character other than one specifically given a magic meaning
+by 1003.2 (such magic meanings occur only in obsolete [``basic''] REs)
+is taken as an ordinary character.
+.PP
+Any unmatched [ is a REG_EBRACK error.
+.PP
+Equivalence classes cannot begin or end bracket-expression ranges.
+The endpoint of one range cannot begin another.
+.PP
+RE_DUP_MAX, the limit on repetition counts in bounded repetitions, is 255.
+.PP
+A repetition operator (?, *, +, or bounds) cannot follow another
+repetition operator.
+A repetition operator cannot begin an expression or subexpression
+or follow `^' or `|'.
+.PP
+`|' cannot appear first or last in a (sub)expression or after another `|',
+i.e. an operand of `|' cannot be an empty subexpression.
+An empty parenthesized subexpression, `()', is legal and matches an
+empty (sub)string.
+An empty string is not a legal RE.
+.PP
+A `{' followed by a digit is considered the beginning of bounds for a
+bounded repetition, which must then follow the syntax for bounds.
+A `{' \fInot\fR followed by a digit is considered an ordinary character.
+.PP
+`^' and `$' beginning and ending subexpressions in obsolete (``basic'')
+REs are anchors, not ordinary characters.
+.SH SEE ALSO
+grep(1), regex(7)
+.PP
+POSIX 1003.2, sections 2.8 (Regular Expression Notation)
+and
+B.5 (C Binding for Regular Expression Matching).
+.SH DIAGNOSTICS
+Non-zero error codes from
+.I regcomp
+and
+.I regexec
+include the following:
+.PP
+.nf
+.ta \w'REG_ECOLLATE'u+3n
+REG_NOMATCH regexec() failed to match
+REG_BADPAT invalid regular expression
+REG_ECOLLATE invalid collating element
+REG_ECTYPE invalid character class
+REG_EESCAPE \e applied to unescapable character
+REG_ESUBREG invalid backreference number
+REG_EBRACK brackets [ ] not balanced
+REG_EPAREN parentheses ( ) not balanced
+REG_EBRACE braces { } not balanced
+REG_BADBR invalid repetition count(s) in { }
+REG_ERANGE invalid character range in [ ]
+REG_ESPACE ran out of memory
+REG_BADRPT ?, *, or + operand invalid
+REG_EMPTY empty (sub)expression
+REG_ASSERT ``can't happen''\(emyou found a bug
+REG_INVARG invalid argument, e.g. negative-length string
+.fi
+.SH HISTORY
+Written by Henry Spencer at University of Toronto,
+henry@zoo.toronto.edu.
+.SH BUGS
+This is an alpha release with known defects.
+Please report problems.
+.PP
+There is one known functionality bug.
+The implementation of internationalization is incomplete:
+the locale is always assumed to be the default one of 1003.2,
+and only the collating elements etc. of that locale are available.
+.PP
+The back-reference code is subtle and doubts linger about its correctness
+in complex cases.
+.PP
+.I Regexec
+performance is poor.
+This will improve with later releases.
+.I Nmatch
+exceeding 0 is expensive;
+.I nmatch
+exceeding 1 is worse.
+.I Regexec
+is largely insensitive to RE complexity \fIexcept\fR that back
+references are massively expensive.
+RE length does matter; in particular, there is a strong speed bonus
+for keeping RE length under about 30 characters,
+with most special characters counting roughly double.
+.PP
+.I Regcomp
+implements bounded repetitions by macro expansion,
+which is costly in time and space if counts are large
+or bounded repetitions are nested.
+An RE like, say,
+`((((a{1,100}){1,100}){1,100}){1,100}){1,100}'
+will (eventually) run almost any existing machine out of swap space.
+.PP
+There are suspected problems with response to obscure error conditions.
+Notably,
+certain kinds of internal overflow,
+produced only by truly enormous REs or by multiply nested bounded repetitions,
+are probably not handled well.
+.PP
+Due to a mistake in 1003.2, things like `a)b' are legal REs because `)' is
+a special character only in the presence of a previous unmatched `('.
+This can't be fixed until the spec is fixed.
+.PP
+The standard's definition of back references is vague.
+For example, does
+`a\e(\e(b\e)*\e2\e)*d' match `abbbd'?
+Until the standard is clarified,
+behavior in such cases should not be relied on.
+.PP
+The implementation of word-boundary matching is a bit of a kludge,
+and bugs may lurk in combinations of word-boundary matching and anchoring.
diff --git a/ext/ereg/regex/regex.7 b/ext/ereg/regex/regex.7
new file mode 100644
index 0000000..d89012b
--- /dev/null
+++ b/ext/ereg/regex/regex.7
@@ -0,0 +1,233 @@
+.TH REGEX 7 "7 Feb 1994"
+.BY "Henry Spencer"
+.SH NAME
+regex \- POSIX 1003.2 regular expressions
+.SH DESCRIPTION
+Regular expressions (``RE''s),
+as defined in POSIX 1003.2, come in two forms:
+modern REs (roughly those of
+.IR egrep ;
+1003.2 calls these ``extended'' REs)
+and obsolete REs (roughly those of
+.IR ed ;
+1003.2 ``basic'' REs).
+Obsolete REs mostly exist for backward compatibility in some old programs;
+they will be discussed at the end.
+1003.2 leaves some aspects of RE syntax and semantics open;
+`\(dg' marks decisions on these aspects that
+may not be fully portable to other 1003.2 implementations.
+.PP
+A (modern) RE is one\(dg or more non-empty\(dg \fIbranches\fR,
+separated by `|'.
+It matches anything that matches one of the branches.
+.PP
+A branch is one\(dg or more \fIpieces\fR, concatenated.
+It matches a match for the first, followed by a match for the second, etc.
+.PP
+A piece is an \fIatom\fR possibly followed
+by a single\(dg `*', `+', `?', or \fIbound\fR.
+An atom followed by `*' matches a sequence of 0 or more matches of the atom.
+An atom followed by `+' matches a sequence of 1 or more matches of the atom.
+An atom followed by `?' matches a sequence of 0 or 1 matches of the atom.
+.PP
+A \fIbound\fR is `{' followed by an unsigned decimal integer,
+possibly followed by `,'
+possibly followed by another unsigned decimal integer,
+always followed by `}'.
+The integers must lie between 0 and RE_DUP_MAX (255\(dg) inclusive,
+and if there are two of them, the first may not exceed the second.
+An atom followed by a bound containing one integer \fIi\fR
+and no comma matches
+a sequence of exactly \fIi\fR matches of the atom.
+An atom followed by a bound
+containing one integer \fIi\fR and a comma matches
+a sequence of \fIi\fR or more matches of the atom.
+An atom followed by a bound
+containing two integers \fIi\fR and \fIj\fR matches
+a sequence of \fIi\fR through \fIj\fR (inclusive) matches of the atom.
+.PP
+An atom is a regular expression enclosed in `()' (matching a match for the
+regular expression),
+an empty set of `()' (matching the null string)\(dg,
+a \fIbracket expression\fR (see below), `.'
+(matching any single character), `^' (matching the null string at the
+beginning of a line), `$' (matching the null string at the
+end of a line), a `\e' followed by one of the characters
+`^.[$()|*+?{\e'
+(matching that character taken as an ordinary character),
+a `\e' followed by any other character\(dg
+(matching that character taken as an ordinary character,
+as if the `\e' had not been present\(dg),
+or a single character with no other significance (matching that character).
+A `{' followed by a character other than a digit is an ordinary
+character, not the beginning of a bound\(dg.
+It is illegal to end an RE with `\e'.
+.PP
+A \fIbracket expression\fR is a list of characters enclosed in `[]'.
+It normally matches any single character from the list (but see below).
+If the list begins with `^',
+it matches any single character
+(but see below) \fInot\fR from the rest of the list.
+If two characters in the list are separated by `\-', this is shorthand
+for the full \fIrange\fR of characters between those two (inclusive) in the
+collating sequence,
+e.g. `[0-9]' in ASCII matches any decimal digit.
+It is illegal\(dg for two ranges to share an
+endpoint, e.g. `a-c-e'.
+Ranges are very collating-sequence-dependent,
+and portable programs should avoid relying on them.
+.PP
+To include a literal `]' in the list, make it the first character
+(following a possible `^').
+To include a literal `\-', make it the first or last character,
+or the second endpoint of a range.
+To use a literal `\-' as the first endpoint of a range,
+enclose it in `[.' and `.]' to make it a collating element (see below).
+With the exception of these and some combinations using `[' (see next
+paragraphs), all other special characters, including `\e', lose their
+special significance within a bracket expression.
+.PP
+Within a bracket expression, a collating element (a character,
+a multi-character sequence that collates as if it were a single character,
+or a collating-sequence name for either)
+enclosed in `[.' and `.]' stands for the
+sequence of characters of that collating element.
+The sequence is a single element of the bracket expression's list.
+A bracket expression containing a multi-character collating element
+can thus match more than one character,
+e.g. if the collating sequence includes a `ch' collating element,
+then the RE `[[.ch.]]*c' matches the first five characters
+of `chchcc'.
+.PP
+Within a bracket expression, a collating element enclosed in `[=' and
+`=]' is an equivalence class, standing for the sequences of characters
+of all collating elements equivalent to that one, including itself.
+(If there are no other equivalent collating elements,
+the treatment is as if the enclosing delimiters were `[.' and `.]'.)
+For example, if o and \o'o^' are the members of an equivalence class,
+then `[[=o=]]', `[[=\o'o^'=]]', and `[o\o'o^']' are all synonymous.
+An equivalence class may not\(dg be an endpoint
+of a range.
+.PP
+Within a bracket expression, the name of a \fIcharacter class\fR enclosed
+in `[:' and `:]' stands for the list of all characters belonging to that
+class.
+Standard character class names are:
+.PP
+.RS
+.nf
+.ta 3c 6c 9c
+alnum digit punct
+alpha graph space
+blank lower upper
+cntrl print xdigit
+.fi
+.RE
+.PP
+These stand for the character classes defined in
+.IR ctype (3).
+A locale may provide others.
+A character class may not be used as an endpoint of a range.
+.PP
+There are two special cases\(dg of bracket expressions:
+the bracket expressions `[[:<:]]' and `[[:>:]]' match the null string at
+the beginning and end of a word respectively.
+A word is defined as a sequence of
+word characters
+which is neither preceded nor followed by
+word characters.
+A word character is an
+.I alnum
+character (as defined by
+.IR ctype (3))
+or an underscore.
+This is an extension,
+compatible with but not specified by POSIX 1003.2,
+and should be used with
+caution in software intended to be portable to other systems.
+.PP
+In the event that an RE could match more than one substring of a given
+string,
+the RE matches the one starting earliest in the string.
+If the RE could match more than one substring starting at that point,
+it matches the longest.
+Subexpressions also match the longest possible substrings, subject to
+the constraint that the whole match be as long as possible,
+with subexpressions starting earlier in the RE taking priority over
+ones starting later.
+Note that higher-level subexpressions thus take priority over
+their lower-level component subexpressions.
+.PP
+Match lengths are measured in characters, not collating elements.
+A null string is considered longer than no match at all.
+For example,
+`bb*' matches the three middle characters of `abbbc',
+`(wee|week)(knights|nights)' matches all ten characters of `weeknights',
+when `(.*).*' is matched against `abc' the parenthesized subexpression
+matches all three characters, and
+when `(a*)*' is matched against `bc' both the whole RE and the parenthesized
+subexpression match the null string.
+.PP
+If case-independent matching is specified,
+the effect is much as if all case distinctions had vanished from the
+alphabet.
+When an alphabetic that exists in multiple cases appears as an
+ordinary character outside a bracket expression, it is effectively
+transformed into a bracket expression containing both cases,
+e.g. `x' becomes `[xX]'.
+When it appears inside a bracket expression, all case counterparts
+of it are added to the bracket expression, so that (e.g.) `[x]'
+becomes `[xX]' and `[^x]' becomes `[^xX]'.
+.PP
+No particular limit is imposed on the length of REs\(dg.
+Programs intended to be portable should not employ REs longer
+than 256 bytes,
+as an implementation can refuse to accept such REs and remain
+POSIX-compliant.
+.PP
+Obsolete (``basic'') regular expressions differ in several respects.
+`|', `+', and `?' are ordinary characters and there is no equivalent
+for their functionality.
+The delimiters for bounds are `\e{' and `\e}',
+with `{' and `}' by themselves ordinary characters.
+The parentheses for nested subexpressions are `\e(' and `\e)',
+with `(' and `)' by themselves ordinary characters.
+`^' is an ordinary character except at the beginning of the
+RE or\(dg the beginning of a parenthesized subexpression,
+`$' is an ordinary character except at the end of the
+RE or\(dg the end of a parenthesized subexpression,
+and `*' is an ordinary character if it appears at the beginning of the
+RE or the beginning of a parenthesized subexpression
+(after a possible leading `^').
+Finally, there is one new type of atom, a \fIback reference\fR:
+`\e' followed by a non-zero decimal digit \fId\fR
+matches the same sequence of characters
+matched by the \fId\fRth parenthesized subexpression
+(numbering subexpressions by the positions of their opening parentheses,
+left to right),
+so that (e.g.) `\e([bc]\e)\e1' matches `bb' or `cc' but not `bc'.
+.SH SEE ALSO
+regex(3)
+.PP
+POSIX 1003.2, section 2.8 (Regular Expression Notation).
+.SH BUGS
+Having two kinds of REs is a botch.
+.PP
+The current 1003.2 spec says that `)' is an ordinary character in
+the absence of an unmatched `(';
+this was an unintentional result of a wording error,
+and change is likely.
+Avoid relying on it.
+.PP
+Back references are a dreadful botch,
+posing major problems for efficient implementations.
+They are also somewhat vaguely defined
+(does
+`a\e(\e(b\e)*\e2\e)*d' match `abbbd'?).
+Avoid using them.
+.PP
+1003.2's specification of case-independent matching is vague.
+The ``one case implies all cases'' definition given above
+is current consensus among implementors as to the right interpretation.
+.PP
+The syntax for word boundaries is incredibly ugly.
diff --git a/ext/ereg/regex/regex.dsp b/ext/ereg/regex/regex.dsp
new file mode 100644
index 0000000..e8f1ad4
--- /dev/null
+++ b/ext/ereg/regex/regex.dsp
@@ -0,0 +1,106 @@
+# Microsoft Developer Studio Project File - Name="regex" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=regex - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "regex.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "regex.mak" CFG="regex - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "regex - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "regex - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "regex - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+
+!ELSEIF "$(CFG)" == "regex - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+
+!ENDIF
+
+# Begin Target
+
+# Name "regex - Win32 Release"
+# Name "regex - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\regcomp.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\regerror.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\regexec.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\regfree.c
+# End Source File
+# End Target
+# End Project
diff --git a/ext/ereg/regex/regex.dsw b/ext/ereg/regex/regex.dsw
new file mode 100644
index 0000000..7b7df81
--- /dev/null
+++ b/ext/ereg/regex/regex.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 5.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "regex"=.\regex.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/ext/ereg/regex/regex.h b/ext/ereg/regex/regex.h
new file mode 100644
index 0000000..162b2b0
--- /dev/null
+++ b/ext/ereg/regex/regex.h
@@ -0,0 +1,79 @@
+#ifndef _REGEX_H_
+#define _REGEX_H_ /* never again */
+/* ========= begin header generated by ./mkh ========= */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* === regex2.h === */
+#ifdef WIN32
+#define API_EXPORT(type) __declspec(dllexport) type __stdcall
+#else
+#define API_EXPORT(type) type
+#endif
+
+typedef off_t regoff_t;
+typedef struct {
+ int re_magic;
+ size_t re_nsub; /* number of parenthesized subexpressions */
+ const char *re_endp; /* end pointer for REG_PEND */
+ struct re_guts *re_g; /* none of your business :-) */
+} regex_t;
+typedef struct {
+ regoff_t rm_so; /* start of match */
+ regoff_t rm_eo; /* end of match */
+} regmatch_t;
+
+
+/* === regcomp.c === */
+API_EXPORT(int) regcomp(regex_t *, const char *, int);
+#define REG_BASIC 0000
+#define REG_EXTENDED 0001
+#define REG_ICASE 0002
+#define REG_NOSUB 0004
+#define REG_NEWLINE 0010
+#define REG_NOSPEC 0020
+#define REG_PEND 0040
+#define REG_DUMP 0200
+
+
+/* === regerror.c === */
+#define REG_NOMATCH 1
+#define REG_BADPAT 2
+#define REG_ECOLLATE 3
+#define REG_ECTYPE 4
+#define REG_EESCAPE 5
+#define REG_ESUBREG 6
+#define REG_EBRACK 7
+#define REG_EPAREN 8
+#define REG_EBRACE 9
+#define REG_BADBR 10
+#define REG_ERANGE 11
+#define REG_ESPACE 12
+#define REG_BADRPT 13
+#define REG_EMPTY 14
+#define REG_ASSERT 15
+#define REG_INVARG 16
+#define REG_ATOI 255 /* convert name to number (!) */
+#define REG_ITOA 0400 /* convert number to name (!) */
+API_EXPORT(size_t) regerror(int, const regex_t *, char *, size_t);
+
+
+/* === regexec.c === */
+API_EXPORT(int) regexec(const regex_t *, const char *, size_t, regmatch_t [], int);
+#define REG_NOTBOL 00001
+#define REG_NOTEOL 00002
+#define REG_STARTEND 00004
+#define REG_TRACE 00400 /* tracing of execution */
+#define REG_LARGE 01000 /* force large representation */
+#define REG_BACKR 02000 /* force use of backref code */
+
+
+/* === regfree.c === */
+API_EXPORT(void) regfree(regex_t *);
+
+#ifdef __cplusplus
+}
+#endif
+/* ========= end header generated by ./mkh ========= */
+#endif
diff --git a/ext/ereg/regex/regex.mak b/ext/ereg/regex/regex.mak
new file mode 100644
index 0000000..b87ded3
--- /dev/null
+++ b/ext/ereg/regex/regex.mak
@@ -0,0 +1,304 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on regex.dsp
+!IF "$(CFG)" == ""
+CFG=regex - Win32 Release
+!MESSAGE No configuration specified. Defaulting to regex - Win32 Release.
+!ENDIF
+
+!IF "$(CFG)" != "regex - Win32 Release" && "$(CFG)" != "regex - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "regex.mak" CFG="regex - Win32 Release"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "regex - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "regex - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+CPP=cl.exe
+
+!IF "$(CFG)" == "regex - Win32 Release"
+
+OUTDIR=.\Release
+INTDIR=.\Release
+# Begin Custom Macros
+OutDir=.\.\Release
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\regex.lib"
+
+!ELSE
+
+ALL : "$(OUTDIR)\regex.lib"
+
+!ENDIF
+
+CLEAN :
+ -@erase "$(INTDIR)\regcomp.obj"
+ -@erase "$(INTDIR)\regerror.obj"
+ -@erase "$(INTDIR)\regexec.obj"
+ -@erase "$(INTDIR)\regfree.obj"
+ -@erase "$(INTDIR)\vc50.idb"
+ -@erase "$(OUTDIR)\regex.lib"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "." /D "WIN32" /D "NDEBUG" /D "_WINDOWS"\
+ /Fp"$(INTDIR)\regex.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+CPP_OBJS=.\Release/
+CPP_SBRS=.
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\regex.bsc"
+BSC32_SBRS= \
+
+LIB32=link.exe -lib
+LIB32_FLAGS=/nologo /out:"$(OUTDIR)\regex.lib"
+LIB32_OBJS= \
+ "$(INTDIR)\regcomp.obj" \
+ "$(INTDIR)\regerror.obj" \
+ "$(INTDIR)\regexec.obj" \
+ "$(INTDIR)\regfree.obj"
+
+"$(OUTDIR)\regex.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
+ $(LIB32) @<<
+ $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "regex - Win32 Debug"
+
+OUTDIR=.\Debug
+INTDIR=.\Debug
+# Begin Custom Macros
+OutDir=.\.\Debug
+# End Custom Macros
+
+!IF "$(RECURSE)" == "0"
+
+ALL : "$(OUTDIR)\regex.lib" "$(OUTDIR)\regex.bsc"
+
+!ELSE
+
+ALL : "$(OUTDIR)\regex.lib" "$(OUTDIR)\regex.bsc"
+
+!ENDIF
+
+CLEAN :
+ -@erase "$(INTDIR)\regcomp.obj"
+ -@erase "$(INTDIR)\regcomp.sbr"
+ -@erase "$(INTDIR)\regerror.obj"
+ -@erase "$(INTDIR)\regerror.sbr"
+ -@erase "$(INTDIR)\regexec.obj"
+ -@erase "$(INTDIR)\regexec.sbr"
+ -@erase "$(INTDIR)\regfree.obj"
+ -@erase "$(INTDIR)\regfree.sbr"
+ -@erase "$(INTDIR)\vc50.idb"
+ -@erase "$(OUTDIR)\regex.bsc"
+ -@erase "$(OUTDIR)\regex.lib"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP_PROJ=/nologo /MDd /W3 /GX /Z7 /Od /I "." /D "WIN32" /D "_DEBUG" /D\
+ "_WINDOWS" /FR"$(INTDIR)\\" /Fp"$(INTDIR)\regex.pch" /YX /Fo"$(INTDIR)\\"\
+ /Fd"$(INTDIR)\\" /FD /c
+CPP_OBJS=.\Debug/
+CPP_SBRS=.\Debug/
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\regex.bsc"
+BSC32_SBRS= \
+ "$(INTDIR)\regcomp.sbr" \
+ "$(INTDIR)\regerror.sbr" \
+ "$(INTDIR)\regexec.sbr" \
+ "$(INTDIR)\regfree.sbr"
+
+"$(OUTDIR)\regex.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
+ $(BSC32) @<<
+ $(BSC32_FLAGS) $(BSC32_SBRS)
+<<
+
+LIB32=link.exe -lib
+LIB32_FLAGS=/nologo /out:"$(OUTDIR)\regex.lib"
+LIB32_OBJS= \
+ "$(INTDIR)\regcomp.obj" \
+ "$(INTDIR)\regerror.obj" \
+ "$(INTDIR)\regexec.obj" \
+ "$(INTDIR)\regfree.obj"
+
+"$(OUTDIR)\regex.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
+ $(LIB32) @<<
+ $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
+<<
+
+!ENDIF
+
+.c{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_OBJS)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(CPP_SBRS)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+
+!IF "$(CFG)" == "regex - Win32 Release" || "$(CFG)" == "regex - Win32 Debug"
+SOURCE=.\regcomp.c
+
+!IF "$(CFG)" == "regex - Win32 Release"
+
+DEP_CPP_REGCO=\
+ ".\cclass.h"\
+ ".\cname.h"\
+ ".\regcomp.ih"\
+ ".\regex.h"\
+ ".\regex2.h"\
+ ".\utils.h"\
+
+
+"$(INTDIR)\regcomp.obj" : $(SOURCE) $(DEP_CPP_REGCO) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "regex - Win32 Debug"
+
+DEP_CPP_REGCO=\
+ ".\cclass.h"\
+ ".\cname.h"\
+ ".\regcomp.ih"\
+ ".\regex.h"\
+ ".\regex2.h"\
+ ".\utils.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\regcomp.obj" "$(INTDIR)\regcomp.sbr" : $(SOURCE) $(DEP_CPP_REGCO)\
+ "$(INTDIR)"
+
+
+!ENDIF
+
+SOURCE=.\regerror.c
+
+!IF "$(CFG)" == "regex - Win32 Release"
+
+DEP_CPP_REGER=\
+ ".\regerror.ih"\
+ ".\regex.h"\
+ ".\utils.h"\
+
+
+"$(INTDIR)\regerror.obj" : $(SOURCE) $(DEP_CPP_REGER) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "regex - Win32 Debug"
+
+DEP_CPP_REGER=\
+ ".\regerror.ih"\
+ ".\regex.h"\
+ ".\utils.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\regerror.obj" "$(INTDIR)\regerror.sbr" : $(SOURCE) $(DEP_CPP_REGER)\
+ "$(INTDIR)"
+
+
+!ENDIF
+
+SOURCE=.\regexec.c
+
+!IF "$(CFG)" == "regex - Win32 Release"
+
+DEP_CPP_REGEX=\
+ ".\engine.c"\
+ ".\engine.ih"\
+ ".\regex.h"\
+ ".\regex2.h"\
+ ".\utils.h"\
+
+
+"$(INTDIR)\regexec.obj" : $(SOURCE) $(DEP_CPP_REGEX) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "regex - Win32 Debug"
+
+DEP_CPP_REGEX=\
+ ".\engine.c"\
+ ".\engine.ih"\
+ ".\regex.h"\
+ ".\regex2.h"\
+ ".\utils.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\regexec.obj" "$(INTDIR)\regexec.sbr" : $(SOURCE) $(DEP_CPP_REGEX)\
+ "$(INTDIR)"
+
+
+!ENDIF
+
+SOURCE=.\regfree.c
+
+!IF "$(CFG)" == "regex - Win32 Release"
+
+DEP_CPP_REGFR=\
+ ".\regex.h"\
+ ".\regex2.h"\
+ ".\utils.h"\
+
+
+"$(INTDIR)\regfree.obj" : $(SOURCE) $(DEP_CPP_REGFR) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "regex - Win32 Debug"
+
+DEP_CPP_REGFR=\
+ ".\regex.h"\
+ ".\regex2.h"\
+ ".\utils.h"\
+ {$(INCLUDE)}"sys\types.h"\
+
+
+"$(INTDIR)\regfree.obj" "$(INTDIR)\regfree.sbr" : $(SOURCE) $(DEP_CPP_REGFR)\
+ "$(INTDIR)"
+
+
+!ENDIF
+
+SOURCE=.\engine.c
+
+!ENDIF
+
diff --git a/ext/ereg/regex/regex2.h b/ext/ereg/regex/regex2.h
new file mode 100644
index 0000000..3e8c0d6
--- /dev/null
+++ b/ext/ereg/regex/regex2.h
@@ -0,0 +1,138 @@
+/*
+ * First, the stuff that ends up in the outside-world include file
+ = #ifdef WIN32
+ = #define API_EXPORT(type) __declspec(dllexport) type __stdcall
+ = #else
+ = #define API_EXPORT(type) type
+ = #endif
+ =
+ = typedef off_t regoff_t;
+ = typedef struct {
+ = int re_magic;
+ = size_t re_nsub; // number of parenthesized subexpressions
+ = const char *re_endp; // end pointer for REG_PEND
+ = struct re_guts *re_g; // none of your business :-)
+ = } regex_t;
+ = typedef struct {
+ = regoff_t rm_so; // start of match
+ = regoff_t rm_eo; // end of match
+ = } regmatch_t;
+ */
+/*
+ * internals of regex_t
+ */
+#define MAGIC1 ((('r'^0200)<<8) | 'e')
+
+/*
+ * The internal representation is a *strip*, a sequence of
+ * operators ending with an endmarker. (Some terminology etc. is a
+ * historical relic of earlier versions which used multiple strips.)
+ * Certain oddities in the representation are there to permit running
+ * the machinery backwards; in particular, any deviation from sequential
+ * flow must be marked at both its source and its destination. Some
+ * fine points:
+ *
+ * - OPLUS_ and O_PLUS are *inside* the loop they create.
+ * - OQUEST_ and O_QUEST are *outside* the bypass they create.
+ * - OCH_ and O_CH are *outside* the multi-way branch they create, while
+ * OOR1 and OOR2 are respectively the end and the beginning of one of
+ * the branches. Note that there is an implicit OOR2 following OCH_
+ * and an implicit OOR1 preceding O_CH.
+ *
+ * In state representations, an operator's bit is on to signify a state
+ * immediately *preceding* "execution" of that operator.
+ */
+typedef unsigned long sop; /* strip operator */
+typedef long sopno;
+#define OPRMASK 0xf8000000
+#define OPDMASK 0x07ffffff
+#define OPSHIFT ((unsigned)27)
+#define OP(n) ((n)&OPRMASK)
+#define OPND(n) ((n)&OPDMASK)
+#define SOP(op, opnd) ((op)|(opnd))
+/* operators meaning operand */
+/* (back, fwd are offsets) */
+#define OEND (1<<OPSHIFT) /* endmarker - */
+#define OCHAR (2<<OPSHIFT) /* character unsigned char */
+#define OBOL (3<<OPSHIFT) /* left anchor - */
+#define OEOL (4<<OPSHIFT) /* right anchor - */
+#define OANY (5<<OPSHIFT) /* . - */
+#define OANYOF (6<<OPSHIFT) /* [...] set number */
+#define OBACK_ (7<<OPSHIFT) /* begin \d paren number */
+#define O_BACK (8<<OPSHIFT) /* end \d paren number */
+#define OPLUS_ (9<<OPSHIFT) /* + prefix fwd to suffix */
+#define O_PLUS (10<<OPSHIFT) /* + suffix back to prefix */
+#define OQUEST_ (11<<OPSHIFT) /* ? prefix fwd to suffix */
+#define O_QUEST (12<<OPSHIFT) /* ? suffix back to prefix */
+#define OLPAREN (13<<OPSHIFT) /* ( fwd to ) */
+#define ORPAREN (14<<OPSHIFT) /* ) back to ( */
+#define OCH_ (15<<OPSHIFT) /* begin choice fwd to OOR2 */
+#define OOR1 (16u<<OPSHIFT) /* | pt. 1 back to OOR1 or OCH_ */
+#define OOR2 (17u<<OPSHIFT) /* | pt. 2 fwd to OOR2 or O_CH */
+#define O_CH (18u<<OPSHIFT) /* end choice back to OOR1 */
+#define OBOW (19u<<OPSHIFT) /* begin word - */
+#define OEOW (20u<<OPSHIFT) /* end word - */
+
+/*
+ * Structure for [] character-set representation. Character sets are
+ * done as bit vectors, grouped 8 to a byte vector for compactness.
+ * The individual set therefore has both a pointer to the byte vector
+ * and a mask to pick out the relevant bit of each byte. A hash code
+ * simplifies testing whether two sets could be identical.
+ *
+ * This will get trickier for multicharacter collating elements. As
+ * preliminary hooks for dealing with such things, we also carry along
+ * a string of multi-character elements, and decide the size of the
+ * vectors at run time.
+ */
+typedef struct {
+ uch *ptr; /* -> uch [csetsize] */
+ uch mask; /* bit within array */
+ uch hash; /* hash code */
+ size_t smultis;
+ char *multis; /* -> char[smulti] ab\0cd\0ef\0\0 */
+} cset;
+/* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */
+#define CHadd(cs, c) ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (c))
+#define CHsub(cs, c) ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (c))
+#define CHIN(cs, c) ((cs)->ptr[(uch)(c)] & (cs)->mask)
+#define MCadd(p, cs, cp) mcadd(p, cs, cp) /* regcomp() internal fns */
+
+/* stuff for character categories */
+typedef unsigned char cat_t;
+
+/*
+ * main compiled-expression structure
+ */
+struct re_guts {
+ int magic;
+# define MAGIC2 ((('R'^0200)<<8)|'E')
+ sop *strip; /* malloced area for strip */
+ int csetsize; /* number of bits in a cset vector */
+ int ncsets; /* number of csets in use */
+ cset *sets; /* -> cset [ncsets] */
+ uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */
+ int cflags; /* copy of regcomp() cflags argument */
+ sopno nstates; /* = number of sops */
+ sopno firststate; /* the initial OEND (normally 0) */
+ sopno laststate; /* the final OEND */
+ int iflags; /* internal flags */
+# define USEBOL 01 /* used ^ */
+# define USEEOL 02 /* used $ */
+# define BAD 04 /* something wrong */
+ int nbol; /* number of ^ used */
+ int neol; /* number of $ used */
+ int ncategories; /* how many character categories */
+ cat_t *categories; /* ->catspace[-CHAR_MIN] */
+ char *must; /* match must contain this string */
+ int mlen; /* length of must */
+ size_t nsub; /* copy of re_nsub */
+ int backrefs; /* does it use back references? */
+ sopno nplus; /* how deep does it nest +s? */
+ /* catspace must be last */
+ cat_t catspace[1]; /* actually [NC] */
+};
+
+/* misc utilities */
+#define OUT (CHAR_MAX+1) /* a non-character value */
+#define ISWORD(c) (isalnum(c) || (c) == '_')
diff --git a/ext/ereg/regex/regexec.c b/ext/ereg/regex/regexec.c
new file mode 100644
index 0000000..a552f5a
--- /dev/null
+++ b/ext/ereg/regex/regexec.c
@@ -0,0 +1,140 @@
+/*
+ * the outer shell of regexec()
+ *
+ * This file includes engine.c *twice*, after muchos fiddling with the
+ * macros that code uses. This lets the same code operate on two different
+ * representations for state sets.
+ */
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <ctype.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regex2.h"
+
+#ifndef NDEBUG
+static int nope = 0; /* for use in asserts; shuts lint up */
+#endif
+
+/* macros for manipulating states, small version */
+#define states long
+#define states1 states /* for later use in regexec() decision */
+#define CLEAR(v) ((v) = 0)
+#define SET0(v, n) ((v) &= ~(1 << (n)))
+#define SET1(v, n) ((v) |= 1 << (n))
+#define ISSET(v, n) ((v) & (1 << (n)))
+#define ASSIGN(d, s) ((d) = (s))
+#define EQ(a, b) ((a) == (b))
+#define STATEVARS int dummy /* dummy version */
+#define STATESETUP(m, n) /* nothing */
+#define STATETEARDOWN(m) /* nothing */
+#define SETUP(v) ((v) = 0)
+#define onestate int
+#define INIT(o, n) ((o) = (unsigned)1 << (n))
+#define INC(o) ((o) <<= 1)
+#define ISSTATEIN(v, o) ((v) & (o))
+/* some abbreviations; note that some of these know variable names! */
+/* do "if I'm here, I can also be there" etc without branches */
+#define FWD(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) << (n))
+#define BACK(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) >> (n))
+#define ISSETBACK(v, n) ((v) & ((unsigned)here >> (n)))
+/* function names */
+#define SNAMES /* engine.c looks after details */
+
+#include "engine.c"
+
+/* now undo things */
+#undef states
+#undef CLEAR
+#undef SET0
+#undef SET1
+#undef ISSET
+#undef ASSIGN
+#undef EQ
+#undef STATEVARS
+#undef STATESETUP
+#undef STATETEARDOWN
+#undef SETUP
+#undef onestate
+#undef INIT
+#undef INC
+#undef ISSTATEIN
+#undef FWD
+#undef BACK
+#undef ISSETBACK
+#undef SNAMES
+
+/* macros for manipulating states, large version */
+#define states char *
+#define CLEAR(v) memset(v, 0, m->g->nstates)
+#define SET0(v, n) ((v)[n] = 0)
+#define SET1(v, n) ((v)[n] = 1)
+#define ISSET(v, n) ((v)[n])
+#define ASSIGN(d, s) memcpy(d, s, m->g->nstates)
+#define EQ(a, b) (memcmp(a, b, m->g->nstates) == 0)
+#define STATEVARS int vn; char *space
+#define STATESETUP(m, nv) { (m)->space = malloc((nv)*(m)->g->nstates); \
+ if ((m)->space == NULL) return(REG_ESPACE); \
+ (m)->vn = 0; }
+#define STATETEARDOWN(m) { free((m)->space); }
+#define SETUP(v) ((v) = &m->space[m->vn++ * m->g->nstates])
+#define onestate int
+#define INIT(o, n) ((o) = (n))
+#define INC(o) ((o)++)
+#define ISSTATEIN(v, o) ((v)[o])
+/* some abbreviations; note that some of these know variable names! */
+/* do "if I'm here, I can also be there" etc without branches */
+#define FWD(dst, src, n) ((dst)[here+(n)] |= (src)[here])
+#define BACK(dst, src, n) ((dst)[here-(n)] |= (src)[here])
+#define ISSETBACK(v, n) ((v)[here - (n)])
+/* function names */
+#define LNAMES /* flag */
+
+#include "engine.c"
+
+/*
+ - regexec - interface for matching
+ = API_EXPORT(int) regexec(const regex_t *, const char *, size_t, \
+ = regmatch_t [], int);
+ = #define REG_NOTBOL 00001
+ = #define REG_NOTEOL 00002
+ = #define REG_STARTEND 00004
+ = #define REG_TRACE 00400 // tracing of execution
+ = #define REG_LARGE 01000 // force large representation
+ = #define REG_BACKR 02000 // force use of backref code
+ *
+ * We put this here so we can exploit knowledge of the state representation
+ * when choosing which matcher to call. Also, by this point the matchers
+ * have been prototyped.
+ */
+API_EXPORT(int) /* 0 success, REG_NOMATCH failure */
+regexec(preg, string, nmatch, pmatch, eflags)
+const regex_t *preg;
+const char *string;
+size_t nmatch;
+regmatch_t pmatch[];
+int eflags;
+{
+ register struct re_guts *g = preg->re_g;
+#ifdef REDEBUG
+# define GOODFLAGS(f) (f)
+#else
+# define GOODFLAGS(f) ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND))
+#endif
+
+ if (preg->re_magic != MAGIC1 || g->magic != MAGIC2)
+ return(REG_BADPAT);
+ assert(!(g->iflags&BAD));
+ if (g->iflags&BAD) /* backstop for no-debug case */
+ return(REG_BADPAT);
+ eflags = GOODFLAGS(eflags);
+
+ if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags&REG_LARGE))
+ return(smatcher(g, (char *)string, nmatch, pmatch, eflags));
+ else
+ return(lmatcher(g, (char *)string, nmatch, pmatch, eflags));
+}
diff --git a/ext/ereg/regex/regfree.c b/ext/ereg/regex/regfree.c
new file mode 100644
index 0000000..9fd618a
--- /dev/null
+++ b/ext/ereg/regex/regfree.c
@@ -0,0 +1,37 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regex2.h"
+
+/*
+ - regfree - free everything
+ = API_EXPORT(void) regfree(regex_t *);
+ */
+API_EXPORT(void)
+regfree(preg)
+regex_t *preg;
+{
+ register struct re_guts *g;
+
+ if (preg->re_magic != MAGIC1) /* oops */
+ return; /* nice to complain, but hard */
+
+ g = preg->re_g;
+ if (g == NULL || g->magic != MAGIC2) /* oops again */
+ return;
+ preg->re_magic = 0; /* mark it invalid */
+ g->magic = 0; /* mark it invalid */
+
+ if (g->strip != NULL)
+ free((char *)g->strip);
+ if (g->sets != NULL)
+ free((char *)g->sets);
+ if (g->setbits != NULL)
+ free((char *)g->setbits);
+ if (g->must != NULL)
+ free(g->must);
+ free((char *)g);
+}
diff --git a/ext/ereg/regex/split.c b/ext/ereg/regex/split.c
new file mode 100644
index 0000000..188bdb7
--- /dev/null
+++ b/ext/ereg/regex/split.c
@@ -0,0 +1,316 @@
+#include <stdio.h>
+#include <string.h>
+
+/*
+ - split - divide a string into fields, like awk split()
+ = int split(char *string, char *fields[], int nfields, char *sep);
+ */
+int /* number of fields, including overflow */
+split(string, fields, nfields, sep)
+char *string;
+char *fields[]; /* list is not NULL-terminated */
+int nfields; /* number of entries available in fields[] */
+char *sep; /* "" white, "c" single char, "ab" [ab]+ */
+{
+ register char *p = string;
+ register char c; /* latest character */
+ register char sepc = sep[0];
+ register char sepc2;
+ register int fn;
+ register char **fp = fields;
+ register char *sepp;
+ register int trimtrail;
+
+ /* white space */
+ if (sepc == '\0') {
+ while ((c = *p++) == ' ' || c == '\t')
+ continue;
+ p--;
+ trimtrail = 1;
+ sep = " \t"; /* note, code below knows this is 2 long */
+ sepc = ' ';
+ } else
+ trimtrail = 0;
+ sepc2 = sep[1]; /* now we can safely pick this up */
+
+ /* catch empties */
+ if (*p == '\0')
+ return(0);
+
+ /* single separator */
+ if (sepc2 == '\0') {
+ fn = nfields;
+ for (;;) {
+ *fp++ = p;
+ fn--;
+ if (fn == 0)
+ break;
+ while ((c = *p++) != sepc)
+ if (c == '\0')
+ return(nfields - fn);
+ *(p-1) = '\0';
+ }
+ /* we have overflowed the fields vector -- just count them */
+ fn = nfields;
+ for (;;) {
+ while ((c = *p++) != sepc)
+ if (c == '\0')
+ return(fn);
+ fn++;
+ }
+ /* not reached */
+ }
+
+ /* two separators */
+ if (sep[2] == '\0') {
+ fn = nfields;
+ for (;;) {
+ *fp++ = p;
+ fn--;
+ while ((c = *p++) != sepc && c != sepc2)
+ if (c == '\0') {
+ if (trimtrail && **(fp-1) == '\0')
+ fn++;
+ return(nfields - fn);
+ }
+ if (fn == 0)
+ break;
+ *(p-1) = '\0';
+ while ((c = *p++) == sepc || c == sepc2)
+ continue;
+ p--;
+ }
+ /* we have overflowed the fields vector -- just count them */
+ fn = nfields;
+ while (c != '\0') {
+ while ((c = *p++) == sepc || c == sepc2)
+ continue;
+ p--;
+ fn++;
+ while ((c = *p++) != '\0' && c != sepc && c != sepc2)
+ continue;
+ }
+ /* might have to trim trailing white space */
+ if (trimtrail) {
+ p--;
+ while ((c = *--p) == sepc || c == sepc2)
+ continue;
+ p++;
+ if (*p != '\0') {
+ if (fn == nfields+1)
+ *p = '\0';
+ fn--;
+ }
+ }
+ return(fn);
+ }
+
+ /* n separators */
+ fn = 0;
+ for (;;) {
+ if (fn < nfields)
+ *fp++ = p;
+ fn++;
+ for (;;) {
+ c = *p++;
+ if (c == '\0')
+ return(fn);
+ sepp = sep;
+ while ((sepc = *sepp++) != '\0' && sepc != c)
+ continue;
+ if (sepc != '\0') /* it was a separator */
+ break;
+ }
+ if (fn < nfields)
+ *(p-1) = '\0';
+ for (;;) {
+ c = *p++;
+ sepp = sep;
+ while ((sepc = *sepp++) != '\0' && sepc != c)
+ continue;
+ if (sepc == '\0') /* it wasn't a separator */
+ break;
+ }
+ p--;
+ }
+
+ /* not reached */
+}
+
+#ifdef TEST_SPLIT
+
+
+/*
+ * test program
+ * pgm runs regression
+ * pgm sep splits stdin lines by sep
+ * pgm str sep splits str by sep
+ * pgm str sep n splits str by sep n times
+ */
+int
+main(argc, argv)
+int argc;
+char *argv[];
+{
+ char buf[512];
+ register int n;
+# define MNF 10
+ char *fields[MNF];
+
+ if (argc > 4)
+ for (n = atoi(argv[3]); n > 0; n--) {
+ (void) strcpy(buf, argv[1]);
+ }
+ else if (argc > 3)
+ for (n = atoi(argv[3]); n > 0; n--) {
+ (void) strcpy(buf, argv[1]);
+ (void) split(buf, fields, MNF, argv[2]);
+ }
+ else if (argc > 2)
+ dosplit(argv[1], argv[2]);
+ else if (argc > 1)
+ while (fgets(buf, sizeof(buf), stdin) != NULL) {
+ buf[strlen(buf)-1] = '\0'; /* stomp newline */
+ dosplit(buf, argv[1]);
+ }
+ else
+ regress();
+
+ exit(0);
+}
+
+dosplit(string, seps)
+char *string;
+char *seps;
+{
+# define NF 5
+ char *fields[NF];
+ register int nf;
+
+ nf = split(string, fields, NF, seps);
+ print(nf, NF, fields);
+}
+
+print(nf, nfp, fields)
+int nf;
+int nfp;
+char *fields[];
+{
+ register int fn;
+ register int bound;
+
+ bound = (nf > nfp) ? nfp : nf;
+ printf("%d:\t", nf);
+ for (fn = 0; fn < bound; fn++)
+ printf("\"%s\"%s", fields[fn], (fn+1 < nf) ? ", " : "\n");
+}
+
+#define RNF 5 /* some table entries know this */
+struct {
+ char *str;
+ char *seps;
+ int nf;
+ char *fi[RNF];
+} tests[] = {
+ "", " ", 0, { "" },
+ " ", " ", 2, { "", "" },
+ "x", " ", 1, { "x" },
+ "xy", " ", 1, { "xy" },
+ "x y", " ", 2, { "x", "y" },
+ "abc def g ", " ", 5, { "abc", "def", "", "g", "" },
+ " a bcd", " ", 4, { "", "", "a", "bcd" },
+ "a b c d e f", " ", 6, { "a", "b", "c", "d", "e f" },
+ " a b c d ", " ", 6, { "", "a", "b", "c", "d " },
+
+ "", " _", 0, { "" },
+ " ", " _", 2, { "", "" },
+ "x", " _", 1, { "x" },
+ "x y", " _", 2, { "x", "y" },
+ "ab _ cd", " _", 2, { "ab", "cd" },
+ " a_b c ", " _", 5, { "", "a", "b", "c", "" },
+ "a b c_d e f", " _", 6, { "a", "b", "c", "d", "e f" },
+ " a b c d ", " _", 6, { "", "a", "b", "c", "d " },
+
+ "", " _~", 0, { "" },
+ " ", " _~", 2, { "", "" },
+ "x", " _~", 1, { "x" },
+ "x y", " _~", 2, { "x", "y" },
+ "ab _~ cd", " _~", 2, { "ab", "cd" },
+ " a_b c~", " _~", 5, { "", "a", "b", "c", "" },
+ "a b_c d~e f", " _~", 6, { "a", "b", "c", "d", "e f" },
+ "~a b c d ", " _~", 6, { "", "a", "b", "c", "d " },
+
+ "", " _~-", 0, { "" },
+ " ", " _~-", 2, { "", "" },
+ "x", " _~-", 1, { "x" },
+ "x y", " _~-", 2, { "x", "y" },
+ "ab _~- cd", " _~-", 2, { "ab", "cd" },
+ " a_b c~", " _~-", 5, { "", "a", "b", "c", "" },
+ "a b_c-d~e f", " _~-", 6, { "a", "b", "c", "d", "e f" },
+ "~a-b c d ", " _~-", 6, { "", "a", "b", "c", "d " },
+
+ "", " ", 0, { "" },
+ " ", " ", 2, { "", "" },
+ "x", " ", 1, { "x" },
+ "xy", " ", 1, { "xy" },
+ "x y", " ", 2, { "x", "y" },
+ "abc def g ", " ", 4, { "abc", "def", "g", "" },
+ " a bcd", " ", 3, { "", "a", "bcd" },
+ "a b c d e f", " ", 6, { "a", "b", "c", "d", "e f" },
+ " a b c d ", " ", 6, { "", "a", "b", "c", "d " },
+
+ "", "", 0, { "" },
+ " ", "", 0, { "" },
+ "x", "", 1, { "x" },
+ "xy", "", 1, { "xy" },
+ "x y", "", 2, { "x", "y" },
+ "abc def g ", "", 3, { "abc", "def", "g" },
+ "\t a bcd", "", 2, { "a", "bcd" },
+ " a \tb\t c ", "", 3, { "a", "b", "c" },
+ "a b c d e ", "", 5, { "a", "b", "c", "d", "e" },
+ "a b\tc d e f", "", 6, { "a", "b", "c", "d", "e f" },
+ " a b c d e f ", "", 6, { "a", "b", "c", "d", "e f " },
+
+ NULL, NULL, 0, { NULL },
+};
+
+regress()
+{
+ char buf[512];
+ register int n;
+ char *fields[RNF+1];
+ register int nf;
+ register int i;
+ register int printit;
+ register char *f;
+
+ for (n = 0; tests[n].str != NULL; n++) {
+ (void) strcpy(buf, tests[n].str);
+ fields[RNF] = NULL;
+ nf = split(buf, fields, RNF, tests[n].seps);
+ printit = 0;
+ if (nf != tests[n].nf) {
+ printf("split `%s' by `%s' gave %d fields, not %d\n",
+ tests[n].str, tests[n].seps, nf, tests[n].nf);
+ printit = 1;
+ } else if (fields[RNF] != NULL) {
+ printf("split() went beyond array end\n");
+ printit = 1;
+ } else {
+ for (i = 0; i < nf && i < RNF; i++) {
+ f = fields[i];
+ if (f == NULL)
+ f = "(NULL)";
+ if (strcmp(f, tests[n].fi[i]) != 0) {
+ printf("split `%s' by `%s', field %d is `%s', not `%s'\n",
+ tests[n].str, tests[n].seps,
+ i, fields[i], tests[n].fi[i]);
+ printit = 1;
+ }
+ }
+ }
+ if (printit)
+ print(nf, RNF, fields);
+ }
+}
+#endif
diff --git a/ext/ereg/regex/tests b/ext/ereg/regex/tests
new file mode 100644
index 0000000..c058461
--- /dev/null
+++ b/ext/ereg/regex/tests
@@ -0,0 +1,475 @@
+# regular expression test set
+# Lines are at least three fields, separated by one or more tabs. "" stands
+# for an empty field. First field is an RE. Second field is flags. If
+# C flag given, regcomp() is expected to fail, and the third field is the
+# error name (minus the leading REG_).
+#
+# Otherwise it is expected to succeed, and the third field is the string to
+# try matching it against. If there is no fourth field, the match is
+# expected to fail. If there is a fourth field, it is the substring that
+# the RE is expected to match. If there is a fifth field, it is a comma-
+# separated list of what the subexpressions should match, with - indicating
+# no match for that one. In both the fourth and fifth fields, a (sub)field
+# starting with @ indicates that the (sub)expression is expected to match
+# a null string followed by the stuff after the @; this provides a way to
+# test where null strings match. The character `N' in REs and strings
+# is newline, `S' is space, `T' is tab, `Z' is NUL.
+#
+# The full list of flags:
+# - placeholder, does nothing
+# b RE is a BRE, not an ERE
+# & try it as both an ERE and a BRE
+# C regcomp() error expected, third field is error name
+# i REG_ICASE
+# m ("mundane") REG_NOSPEC
+# s REG_NOSUB (not really testable)
+# n REG_NEWLINE
+# ^ REG_NOTBOL
+# $ REG_NOTEOL
+# # REG_STARTEND (see below)
+# p REG_PEND
+#
+# For REG_STARTEND, the start/end offsets are those of the substring
+# enclosed in ().
+
+# basics
+a & a a
+abc & abc abc
+abc|de - abc abc
+a|b|c - abc a
+
+# parentheses and perversions thereof
+a(b)c - abc abc
+a\(b\)c b abc abc
+a( C EPAREN
+a( b a( a(
+a\( - a( a(
+a\( bC EPAREN
+a\(b bC EPAREN
+a(b C EPAREN
+a(b b a(b a(b
+# gag me with a right parenthesis -- 1003.2 goofed here (my fault, partly)
+a) - a) a)
+) - ) )
+# end gagging (in a just world, those *should* give EPAREN)
+a) b a) a)
+a\) bC EPAREN
+\) bC EPAREN
+a()b - ab ab
+a\(\)b b ab ab
+
+# anchoring and REG_NEWLINE
+^abc$ & abc abc
+a^b - a^b
+a^b b a^b a^b
+a$b - a$b
+a$b b a$b a$b
+^ & abc @abc
+$ & abc @
+^$ & "" @
+$^ - "" @
+\($\)\(^\) b "" @
+# stop retching, those are legitimate (although disgusting)
+^^ - "" @
+$$ - "" @
+b$ & abNc
+b$ &n abNc b
+^b$ & aNbNc
+^b$ &n aNbNc b
+^$ &n aNNb @Nb
+^$ n abc
+^$ n abcN @
+$^ n aNNb @Nb
+\($\)\(^\) bn aNNb @Nb
+^^ n^ aNNb @Nb
+$$ n aNNb @NN
+^a ^ a
+a$ $ a
+^a ^n aNb
+^b ^n aNb b
+a$ $n bNa
+b$ $n bNa b
+a*(^b$)c* - b b
+a*\(^b$\)c* b b b
+
+# certain syntax errors and non-errors
+| C EMPTY
+| b | |
+* C BADRPT
+* b * *
++ C BADRPT
+? C BADRPT
+"" &C EMPTY
+() - abc @abc
+\(\) b abc @abc
+a||b C EMPTY
+|ab C EMPTY
+ab| C EMPTY
+(|a)b C EMPTY
+(a|)b C EMPTY
+(*a) C BADRPT
+(+a) C BADRPT
+(?a) C BADRPT
+({1}a) C BADRPT
+\(\{1\}a\) bC BADRPT
+(a|*b) C BADRPT
+(a|+b) C BADRPT
+(a|?b) C BADRPT
+(a|{1}b) C BADRPT
+^* C BADRPT
+^* b * *
+^+ C BADRPT
+^? C BADRPT
+^{1} C BADRPT
+^\{1\} bC BADRPT
+
+# metacharacters, backslashes
+a.c & abc abc
+a[bc]d & abd abd
+a\*c & a*c a*c
+a\\b & a\b a\b
+a\\\*b & a\*b a\*b
+a\bc & abc abc
+a\ &C EESCAPE
+a\\bc & a\bc a\bc
+\{ bC BADRPT
+a\[b & a[b a[b
+a[b &C EBRACK
+# trailing $ is a peculiar special case for the BRE code
+a$ & a a
+a$ & a$
+a\$ & a
+a\$ & a$ a$
+a\\$ & a
+a\\$ & a$
+a\\$ & a\$
+a\\$ & a\ a\
+
+# back references, ugh
+a\(b\)\2c bC ESUBREG
+a\(b\1\)c bC ESUBREG
+a\(b*\)c\1d b abbcbbd abbcbbd bb
+a\(b*\)c\1d b abbcbd
+a\(b*\)c\1d b abbcbbbd
+^\(.\)\1 b abc
+a\([bc]\)\1d b abcdabbd abbd b
+a\(\([bc]\)\2\)*d b abbccd abbccd
+a\(\([bc]\)\2\)*d b abbcbd
+# actually, this next one probably ought to fail, but the spec is unclear
+a\(\(b\)*\2\)*d b abbbd abbbd
+# here is a case that no NFA implementation does right
+\(ab*\)[ab]*\1 b ababaaa ababaaa a
+# check out normal matching in the presence of back refs
+\(a\)\1bcd b aabcd aabcd
+\(a\)\1bc*d b aabcd aabcd
+\(a\)\1bc*d b aabd aabd
+\(a\)\1bc*d b aabcccd aabcccd
+\(a\)\1bc*[ce]d b aabcccd aabcccd
+^\(a\)\1b\(c\)*cd$ b aabcccd aabcccd
+
+# ordinary repetitions
+ab*c & abc abc
+ab+c - abc abc
+ab?c - abc abc
+a\(*\)b b a*b a*b
+a\(**\)b b ab ab
+a\(***\)b bC BADRPT
+*a b *a *a
+**a b a a
+***a bC BADRPT
+
+# the dreaded bounded repetitions
+{ & { {
+{abc & {abc {abc
+{1 C BADRPT
+{1} C BADRPT
+a{b & a{b a{b
+a{1}b - ab ab
+a\{1\}b b ab ab
+a{1,}b - ab ab
+a\{1,\}b b ab ab
+a{1,2}b - aab aab
+a\{1,2\}b b aab aab
+a{1 C EBRACE
+a\{1 bC EBRACE
+a{1a C EBRACE
+a\{1a bC EBRACE
+a{1a} C BADBR
+a\{1a\} bC BADBR
+a{,2} - a{,2} a{,2}
+a\{,2\} bC BADBR
+a{,} - a{,} a{,}
+a\{,\} bC BADBR
+a{1,x} C BADBR
+a\{1,x\} bC BADBR
+a{1,x C EBRACE
+a\{1,x bC EBRACE
+a{300} C BADBR
+a\{300\} bC BADBR
+a{1,0} C BADBR
+a\{1,0\} bC BADBR
+ab{0,0}c - abcac ac
+ab\{0,0\}c b abcac ac
+ab{0,1}c - abcac abc
+ab\{0,1\}c b abcac abc
+ab{0,3}c - abbcac abbc
+ab\{0,3\}c b abbcac abbc
+ab{1,1}c - acabc abc
+ab\{1,1\}c b acabc abc
+ab{1,3}c - acabc abc
+ab\{1,3\}c b acabc abc
+ab{2,2}c - abcabbc abbc
+ab\{2,2\}c b abcabbc abbc
+ab{2,4}c - abcabbc abbc
+ab\{2,4\}c b abcabbc abbc
+((a{1,10}){1,10}){1,10} - a a a,a
+
+# multiple repetitions
+a** &C BADRPT
+a++ C BADRPT
+a?? C BADRPT
+a*+ C BADRPT
+a*? C BADRPT
+a+* C BADRPT
+a+? C BADRPT
+a?* C BADRPT
+a?+ C BADRPT
+a{1}{1} C BADRPT
+a*{1} C BADRPT
+a+{1} C BADRPT
+a?{1} C BADRPT
+a{1}* C BADRPT
+a{1}+ C BADRPT
+a{1}? C BADRPT
+a*{b} - a{b} a{b}
+a\{1\}\{1\} bC BADRPT
+a*\{1\} bC BADRPT
+a\{1\}* bC BADRPT
+
+# brackets, and numerous perversions thereof
+a[b]c & abc abc
+a[ab]c & abc abc
+a[^ab]c & adc adc
+a[]b]c & a]c a]c
+a[[b]c & a[c a[c
+a[-b]c & a-c a-c
+a[^]b]c & adc adc
+a[^-b]c & adc adc
+a[b-]c & a-c a-c
+a[b &C EBRACK
+a[] &C EBRACK
+a[1-3]c & a2c a2c
+a[3-1]c &C ERANGE
+a[1-3-5]c &C ERANGE
+a[[.-.]--]c & a-c a-c
+a[1- &C ERANGE
+a[[. &C EBRACK
+a[[.x &C EBRACK
+a[[.x. &C EBRACK
+a[[.x.] &C EBRACK
+a[[.x.]] & ax ax
+a[[.x,.]] &C ECOLLATE
+a[[.one.]]b & a1b a1b
+a[[.notdef.]]b &C ECOLLATE
+a[[.].]]b & a]b a]b
+a[[:alpha:]]c & abc abc
+a[[:notdef:]]c &C ECTYPE
+a[[: &C EBRACK
+a[[:alpha &C EBRACK
+a[[:alpha:] &C EBRACK
+a[[:alpha,:] &C ECTYPE
+a[[:]:]]b &C ECTYPE
+a[[:-:]]b &C ECTYPE
+a[[:alph:]] &C ECTYPE
+a[[:alphabet:]] &C ECTYPE
+[[:alnum:]]+ - -%@a0X- a0X
+[[:alpha:]]+ - -%@aX0- aX
+[[:blank:]]+ - aSSTb SST
+[[:cntrl:]]+ - aNTb NT
+[[:digit:]]+ - a019b 019
+[[:graph:]]+ - Sa%bS a%b
+[[:lower:]]+ - AabC ab
+[[:print:]]+ - NaSbN aSb
+[[:punct:]]+ - S%-&T %-&
+[[:space:]]+ - aSNTb SNT
+[[:upper:]]+ - aBCd BC
+[[:xdigit:]]+ - p0f3Cq 0f3C
+a[[=b=]]c & abc abc
+a[[= &C EBRACK
+a[[=b &C EBRACK
+a[[=b= &C EBRACK
+a[[=b=] &C EBRACK
+a[[=b,=]] &C ECOLLATE
+a[[=one=]]b & a1b a1b
+
+# complexities
+a(((b)))c - abc abc
+a(b|(c))d - abd abd
+a(b*|c)d - abbd abbd
+# just gotta have one DFA-buster, of course
+a[ab]{20} - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab
+# and an inline expansion in case somebody gets tricky
+a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab] - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab
+# and in case somebody just slips in an NFA...
+a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab](wee|week)(knights|night) - aaaaabaaaabaaaabaaaabweeknights aaaaabaaaabaaaabaaaabweeknights
+# fish for anomalies as the number of states passes 32
+12345678901234567890123456789 - a12345678901234567890123456789b 12345678901234567890123456789
+123456789012345678901234567890 - a123456789012345678901234567890b 123456789012345678901234567890
+1234567890123456789012345678901 - a1234567890123456789012345678901b 1234567890123456789012345678901
+12345678901234567890123456789012 - a12345678901234567890123456789012b 12345678901234567890123456789012
+123456789012345678901234567890123 - a123456789012345678901234567890123b 123456789012345678901234567890123
+# and one really big one, beyond any plausible word width
+1234567890123456789012345678901234567890123456789012345678901234567890 - a1234567890123456789012345678901234567890123456789012345678901234567890b 1234567890123456789012345678901234567890123456789012345678901234567890
+# fish for problems as brackets go past 8
+[ab][cd][ef][gh][ij][kl][mn] - xacegikmoq acegikm
+[ab][cd][ef][gh][ij][kl][mn][op] - xacegikmoq acegikmo
+[ab][cd][ef][gh][ij][kl][mn][op][qr] - xacegikmoqy acegikmoq
+[ab][cd][ef][gh][ij][kl][mn][op][q] - xacegikmoqy acegikmoq
+
+# subtleties of matching
+abc & xabcy abc
+a\(b\)?c\1d b acd
+aBc i Abc Abc
+a[Bc]*d i abBCcd abBCcd
+0[[:upper:]]1 &i 0a1 0a1
+0[[:lower:]]1 &i 0A1 0A1
+a[^b]c &i abc
+a[^b]c &i aBc
+a[^b]c &i adc adc
+[a]b[c] - abc abc
+[a]b[a] - aba aba
+[abc]b[abc] - abc abc
+[abc]b[abd] - abd abd
+a(b?c)+d - accd accd
+(wee|week)(knights|night) - weeknights weeknights
+(we|wee|week|frob)(knights|night|day) - weeknights weeknights
+a[bc]d - xyzaaabcaababdacd abd
+a[ab]c - aaabc abc
+abc s abc abc
+a* & b @b
+
+# Let's have some fun -- try to match a C comment.
+# first the obvious, which looks okay at first glance...
+/\*.*\*/ - /*x*/ /*x*/
+# but...
+/\*.*\*/ - /*x*/y/*z*/ /*x*/y/*z*/
+# okay, we must not match */ inside; try to do that...
+/\*([^*]|\*[^/])*\*/ - /*x*/ /*x*/
+/\*([^*]|\*[^/])*\*/ - /*x*/y/*z*/ /*x*/
+# but...
+/\*([^*]|\*[^/])*\*/ - /*x**/y/*z*/ /*x**/y/*z*/
+# and a still fancier version, which does it right (I think)...
+/\*([^*]|\*+[^*/])*\*+/ - /*x*/ /*x*/
+/\*([^*]|\*+[^*/])*\*+/ - /*x*/y/*z*/ /*x*/
+/\*([^*]|\*+[^*/])*\*+/ - /*x**/y/*z*/ /*x**/
+/\*([^*]|\*+[^*/])*\*+/ - /*x****/y/*z*/ /*x****/
+/\*([^*]|\*+[^*/])*\*+/ - /*x**x*/y/*z*/ /*x**x*/
+/\*([^*]|\*+[^*/])*\*+/ - /*x***x/y/*z*/ /*x***x/y/*z*/
+
+# subexpressions
+a(b)(c)d - abcd abcd b,c
+a(((b)))c - abc abc b,b,b
+a(b|(c))d - abd abd b,-
+a(b*|c|e)d - abbd abbd bb
+a(b*|c|e)d - acd acd c
+a(b*|c|e)d - ad ad @d
+a(b?)c - abc abc b
+a(b?)c - ac ac @c
+a(b+)c - abc abc b
+a(b+)c - abbbc abbbc b