Compare commits

..
838 Commits
Author SHA1 Message Date
SVN Migration 5cb21cbfef This commit was manufactured by cvs2svn to create tag 'php_4_0b1'. 1999-07-23 14:14:44 +00:00
SVN Migration b1617d8ac3 This commit was manufactured by cvs2svn to create branch 'newoperator'. 1999-07-23 14:14:43 +00:00
Danny Heijl f110b97975 New ini-stuff incorporated. Porting to PHP4 and ZTS hopefully complete. 1999-07-23 09:34:14 +00:00
Sascha Schumann c927593c6d ChangeLog 1999-07-23 00:04:24 +00:00
Zeev Suraski d3e8858413 Please add in any changes/bug fixes you've made - we need to keep a details ChangeLog... 1999-07-22 23:54:54 +00:00
Zeev Suraski 5bae591f88 New constants 1999-07-22 22:17:49 +00:00
Zeev Suraski de1acfe33a Time to remove the PHP 3.0 ChangeLog 1999-07-22 21:49:53 +00:00
Sascha Schumann 3ccb07f34b add the HPUX ANSI detection from php3 1999-07-22 21:11:09 +00:00
Stig Bakken 84656f113e add checks for autoconf, automake and whether libzend/TSRM is around 1999-07-22 20:21:07 +00:00
Stig S. Bakken f5bfd16b0b identify ourselves 1999-07-22 20:20:11 +00:00
Sascha Schumann c640f3d8c8 Implement additional heuristic for session id search. Now looks into
REQUEST_URI as well.
1999-07-22 17:55:13 +00:00
Stig Bakken 7ae27b5bcd temporary hack-fix 1999-07-22 15:55:13 +00:00
Andrey Hristov 64dae03eea -Ported all remaining date() options
-Made array_walk() work somewhat, but it's not
 possible to change array values from inside the
 walk function yet
1999-07-22 15:15:41 +00:00
Andrey Hristov a5a07063d2 *** empty log message *** 1999-07-22 14:22:32 +00:00
Danny Heijl 925d48dae6 Blobs now working too. 1999-07-22 09:58:02 +00:00
Danny Heijl dc7cffcd43 Blobs don't work, hash problems. 1999-07-22 07:31:27 +00:00
Stig Bakken d9f52fe0a7 First cut at standard way of making dynamically loadable extensions on UNIX.
Examples on how to test:

 ./configure --with-xml              static
 ./configure --with-xml=/opt         static
 ./configure --with-xml=shared       shared
 ./configure --with-xml=shared,/opt  shared

The difference between these two is that when the extension is shared, it
is not merged into libphpext.a.  The shared extension is currently always
built.  I can't find a way to do just one or the other with automake/libtool,
if someone has a clever idea, please come forward. :-)

"make install" installs the .so (as well as a lot of other cruft) in
$prefix/lib/php.
1999-07-21 21:56:25 +00:00
Zeev Suraski 57323801f8 Fixed the Apache cookie problem (untested) 1999-07-21 20:31:07 +00:00
Andrey Hristov e6fadabf43 Fix for bug #1806 1999-07-21 19:55:24 +00:00
Andrey Hristov 56402ec375 *** empty log message *** 1999-07-21 19:47:40 +00:00
Danny Heijl f857a77e2f Informix extension now works but php_ini stuff still needs rewriting. 1999-07-21 18:23:13 +00:00
Sascha Schumann 9a910ed353 sync with 1.133 1999-07-21 16:12:13 +00:00
Sascha Schumann 7ac7537776 since we all seem to use different tabwidths, reformat this with :set tw=4 1999-07-21 15:47:41 +00:00
Sascha Schumann 0de0ad6348 update 1999-07-21 15:42:18 +00:00
Sascha Schumann f78caff762 merge in change from php3 1999-07-21 15:39:28 +00:00
Sascha Schumann b33d0fd7e7 initial import of DBA 1999-07-21 15:12:32 +00:00
Sascha Schumann 3843821d11 the ; is superflicious 1999-07-21 15:12:22 +00:00
Andrey Hristov adbf932744 *** empty log message *** 1999-07-21 15:10:04 +00:00
Stig Bakken f9b0f60098 that's better 1999-07-21 14:49:17 +00:00
Stig Bakken 57f0f15b9f Debian fixes 1999-07-21 14:43:12 +00:00
Stig Bakken 968d6d9f8d change version number to 4.0b2-dev 1999-07-21 14:42:22 +00:00
Stig Bakken 2ab934bfc2 fix to reiterate that one should _always_ use braces around if/else/for/while 1999-07-21 14:27:05 +00:00
Andrey Hristov 8c63ef0605 It really does work. 1999-07-21 14:19:49 +00:00
Stig S. Bakken 4c285ecdf5 ignore more files 1999-07-21 13:31:52 +00:00
Danny Heijl 575d8541db Started php4/ZTS port of Informix driver. 1999-07-21 12:48:35 +00:00
Sascha Schumann 58bb4adae1 use the same version as in php3 1999-07-21 09:31:48 +00:00
Sascha Schumann 63f7648fdc use reverse lookup array, submitted by bfranklin@dct.com, #1755 1999-07-21 09:02:05 +00:00
Sascha Schumann a7e3a952e7 fix for #1748 1999-07-21 08:55:20 +00:00
Sascha Schumann dbe9e99213 disable broken sprintf test 1999-07-21 08:37:59 +00:00
Sascha Schumann 76cf93994c defaults to empty string 1999-07-21 08:26:51 +00:00
Andrey Hristov 6b82192bf7 Added locale support. 1999-07-20 20:57:04 +00:00
Mike Gerdts 72f675be50 exec() can now properly handle lines longer than (EXEC_INPUT_BUF-2) bytes.
Lines being returned via the array that that contain only "\n" now are
trimmed down to "" to be consistent with exec's whitespace trimming
behavior for all other lines.
1999-07-20 20:19:58 +00:00
Andrey Hristov 3ff606a934 Added 'n' option to date(). 1999-07-20 19:11:32 +00:00
Andi Gutmans acb9cae36d - Include alloca.h when need and available. 1999-07-20 18:26:56 +00:00
Andrey Hristov 2d1b6f0801 Added headers_sent() function 1999-07-20 18:03:27 +00:00
Andrey Hristov f8fdee1c66 Fix for bug #1750. 1999-07-20 16:59:30 +00:00
Sascha Schumann 07e30106b9 get rid of --with-shared-apache
it's currently broken and redundant (use APXS instead)
1999-07-20 16:54:05 +00:00
Andi Gutmans bf8c6dbd99 - Get rid of C++ comments 1999-07-20 13:01:30 +00:00
James Gingerich e0e331967f Remove a bunch of old junk. 1999-07-20 01:15:34 +00:00
Egon Schmid ea28db8625 The last forgotten prototypes I know. 1999-07-19 20:37:17 +00:00
Andrey Hristov 40de81a5d9 Updated status 1999-07-19 20:27:49 +00:00
Andrey Hristov a04521b4f2 Don't forget .cvsignore 1999-07-19 20:24:21 +00:00
Andrey Hristov ced8e51328 Ported WDDX module. 1999-07-19 20:24:03 +00:00
Egon Schmid b64eaf737b It's in PHP 3 and 4. 1999-07-19 20:09:05 +00:00
Zeev Suraski 8d1de13aef 0.91 update 1999-07-19 20:02:12 +00:00
Andi Gutmans e78fc33c35 * Fix Zend version
* Fix a method call bug
1999-07-19 19:58:44 +00:00
Egon Schmid 5fdd45695b Test, will document this soon. 1999-07-19 19:10:13 +00:00
Andrey Hristov 2bc33cbba1 Updating cvsignore 1999-07-19 18:59:05 +00:00
Andrey Hristov 851ee7b598 Moving dlist stuff into core. 1999-07-19 18:58:44 +00:00
Zeev Suraski c1853b5628 *** empty log message *** 1999-07-19 18:37:42 +00:00
Zeev Suraski e19abb96dd *** empty log message *** 1999-07-19 17:58:51 +00:00
Andi Gutmans 8a9d0fa9eb License update 1999-07-19 17:52:38 +00:00
Andi Gutmans 353a2d38d8 Make error codes PHP 3.0 compatible 1999-07-19 16:17:40 +00:00
Andi Gutmans a064237fc0 Fix Win32 compilation 1999-07-19 16:08:43 +00:00
Andrey Hristov d1b1e3513f Kill compiler warnings. 1999-07-19 15:07:17 +00:00
Danny Heijl 951f65f6ed license change 1999-07-19 14:24:09 +00:00
Sascha Schumann afb16a5818 update 1999-07-19 14:07:10 +00:00
Andrey Hristov 18579a5f64 More credits. 1999-07-19 13:35:13 +00:00
Andi Gutmans e3daad2d67 - Should fix the memory leak when returning from the main scope. 1999-07-18 17:33:51 +00:00
Sascha Schumann 99a2aa0f80 allow access to std{in,out,err} by using the php domain 1999-07-18 15:53:50 +00:00
Sascha Schumann 3b7d588f40 more to do 1999-07-18 01:20:38 +00:00
Sascha Schumann e5cfc70f7d add session config to php.ini and adapt the naming scheme for it 1999-07-18 01:00:42 +00:00
Andrey Hristov 715dc6b23a Update credits a bit.
"Overall Work" line should probably be extended.
1999-07-17 20:38:14 +00:00
Andrey Hristov 3335c8ea0d -Kill compile warnings in apache.c
-Make preg_grep() work with copies of array entries
1999-07-17 20:03:10 +00:00
Andrey Hristov 4518351648 Proto change 1999-07-17 19:23:32 +00:00
Zeev Suraski 5a3e983fa4 *** empty log message *** 1999-07-17 19:22:27 +00:00
Zeev Suraski 614b4b781e I was sure I committed these already. Weird 1999-07-17 19:17:42 +00:00
Zeev Suraski fbe571a43a One more necessary .dsp update 1999-07-17 17:35:44 +00:00
Zeev Suraski cbcf7c66bc *** empty log message *** 1999-07-17 17:33:42 +00:00
Zeev Suraski bc29ceef1b * Turn on debug by default
* Remove CREDITS file, point to web page instead
1999-07-17 16:43:11 +00:00
Zeev Suraski 101e1f4c0f Debug on by default 1999-07-17 13:24:53 +00:00
Zeev Suraski dd14884877 Update DSPs 1999-07-17 13:05:43 +00:00
Sascha Schumann fc268e1c7e void some warnings 1999-07-17 12:56:38 +00:00
Sascha Schumann 3736b9b7ce use optional copy 1999-07-17 12:28:17 +00:00
Sascha Schumann 8a7784d462 make copy optional 1999-07-17 12:27:54 +00:00
Zeev Suraski 7af3ce63a6 Oki doki 1999-07-17 11:59:37 +00:00
Zeev Suraski 9bb36e9cfe Some work on makedist 1999-07-17 11:22:17 +00:00
Zeev Suraski a6dc6b88d2 Handle BCMath
Add a license pointer
1999-07-17 10:59:22 +00:00
Zeev Suraski 3b142d5a3d We'll have to live without these files somehow. 1999-07-17 10:34:01 +00:00
Zeev Suraski 51aa31b671 Dummies 1999-07-17 10:15:42 +00:00
Zeev Suraski 35b3b03fe4 We need to disable bcmath by default 1999-07-17 10:14:04 +00:00
Zeev Suraski af58c35f5c Remove MEMORY_LIMIT from PHP, it's a Zend issue... 1999-07-17 00:05:09 +00:00
Zeev Suraski 8a15917de1 Get the Sybase modules uptodate 1999-07-16 22:00:53 +00:00
Zeev Suraski a316ff791c *** empty log message *** 1999-07-16 21:53:17 +00:00
Andrey Hristov 459ed2b1ad A little change in how array_splice/array_slice handle length parameter.
Makes it compatible with Perl.
1999-07-16 20:47:20 +00:00
Andrey Hristov 7201cdac96 Updated the functionality of array_splice. 1999-07-16 20:08:06 +00:00
Sascha Schumann 538e1cd230 the regex check relies on a previously set APXS variable,
so it needs to be after the apxs check
1999-07-16 19:28:33 +00:00
Sascha Schumann bd07cce770 merge fix 1999-07-16 19:07:13 +00:00
Sascha Schumann 36cf6cf22a unnecessary, breaks the build 1999-07-16 18:23:38 +00:00
Sascha Schumann 68b0f0b418 This is so ugly, I hate myself for committing it 1999-07-16 18:05:24 +00:00
Zeev Suraski 1671424a5f Get the LDAP module uptodate 1999-07-16 18:01:55 +00:00
Sascha Schumann 064a4ea88a avoid nameclash 1999-07-16 18:00:06 +00:00
Sascha Schumann e20424e45f fix detection 1999-07-16 17:44:11 +00:00
Zeev Suraski a6a09f7e98 *** empty log message *** 1999-07-16 17:27:42 +00:00
Zeev Suraski 916f2f2927 *** empty log message *** 1999-07-16 17:26:16 +00:00
Zeev Suraski 58a6d48014 Get postgresql module uptodate 1999-07-16 17:19:11 +00:00
Zeev Suraski dc09865f4a Oops #2 1999-07-16 17:16:31 +00:00
Zeev Suraski f17bbb9014 Oops 1999-07-16 17:10:02 +00:00
Zeev Suraski 4e6c2b468c * Get the mSQL module up to date 1999-07-16 17:06:48 +00:00
Zeev Suraski 2c91f1d91b Minor fix 1999-07-16 16:50:49 +00:00
Zeev Suraski d66fad5fcd Ignore T_PHP_TRACK_VARS in the parser (handled in the scanner) 1999-07-16 16:42:49 +00:00
Zeev Suraski e7e2af5d78 Fix TS version 1999-07-16 16:09:01 +00:00
Zeev Suraski b5b1117760 License update 1999-07-16 14:58:16 +00:00
Zeev Suraski c5724cbd14 License update 1999-07-16 13:13:16 +00:00
Sascha Schumann 42736999bc define sid to "", if we are in cookie mode 1999-07-15 21:14:46 +00:00
Andi Gutmans 91d7ba7610 Change true/false back to 1/"" 1999-07-15 20:38:00 +00:00
Andi Gutmans da648c0fb1 Fix a lock issue 1999-07-15 19:59:18 +00:00
Sascha Schumann 2a39219142 we don't need php_sid 1999-07-15 19:51:13 +00:00
Sascha Schumann 30c131c8ae that should be included 1st 1999-07-15 19:43:26 +00:00
Sascha Schumann 4ea29a808d define SID appropiately 1999-07-15 19:37:35 +00:00
Andi Gutmans f5ffc630aa *** empty log message *** 1999-07-15 19:34:26 +00:00
Sascha Schumann 68de8a2842 that should be included 1st 1999-07-15 19:31:39 +00:00
Andi Gutmans 527a7429bc *** empty log message *** 1999-07-15 19:31:29 +00:00
Andi Gutmans eaebc48e5e More 3->4 changes 1999-07-15 19:28:49 +00:00
Andi Gutmans 1db7f1a910 * PHP 3.0 -> 4.0 changes
* Add php_admin Apache directives
1999-07-15 19:26:25 +00:00
Andi Gutmans 2a43afd2ce Sooner than you think, Sascha :) 1999-07-15 18:33:41 +00:00
Andi Gutmans 5fc8562b5d *** empty log message *** 1999-07-15 17:49:55 +00:00
Andrey Hristov 582f6d032e Added .cvsignore 1999-07-15 14:55:01 +00:00
Rasmus Lerdorf 895cab2838 A useless check 1999-07-15 12:42:46 +00:00
Sascha Schumann 138dd94c8d disable zend_handle_sigsegv 1999-07-15 12:17:34 +00:00
Zeev Suraski b7fe07d8dc php3.ini -> php.ini 1999-07-14 23:34:30 +00:00
Zeev Suraski e883283590 * Update logos
* Move from PreAlpha 1 to Beta 1.
1999-07-14 23:33:00 +00:00
Rasmus Lerdorf 75f62dc415 How did this ever work without this #define ? 1999-07-14 21:49:35 +00:00
Andi Gutmans 762158aa65 Fix thread unsafe constants startup 1999-07-14 19:49:19 +00:00
Rasmus Lerdorf 2beb929311 Remove some useless stuff 1999-07-14 19:21:43 +00:00
Rasmus Lerdorf 0fa438a22a Fix imap build problem 1999-07-14 19:16:59 +00:00
Rasmus Lerdorf 549dfc78e2 Small grammar fix 1999-07-14 17:09:09 +00:00
Andi Gutmans db2594ff13 *** empty log message *** 1999-07-14 16:06:11 +00:00
Andi Gutmans 3e6bce59b3 - Add a bitwise flag to phpinfo()
- Import a draft of the new PHP license
1999-07-14 16:02:10 +00:00
Andi Gutmans fec59d3b4d - License update
- Fix multithreaded constants startup
1999-07-14 16:00:47 +00:00
Rasmus Lerdorf d22cbad17d Fix logic here - the error message was bogus when it couldn't find the
imap lib
1999-07-14 15:22:02 +00:00
Rasmus Lerdorf ce6faf02f6 Woops, this was in the wrong place 1999-07-14 15:15:42 +00:00
Zeev Suraski 05e4d7bb33 change php4_value and php4_flag to php_value and php_flag 1999-07-14 10:26:43 +00:00
Andi Gutmans 078c3ce198 - Fix for boolean convert to number 1999-07-14 09:10:14 +00:00
Thies C. Arntzen f03ad4c7d6 *** empty log message *** 1999-07-13 13:22:15 +00:00
Sascha Schumann 8f29babc8e add some which are always substituted 1999-07-12 20:21:14 +00:00
Rasmus Lerdorf fa7605f289 Tested imap, and had a look at ldap. ldap should be working, but my
ldap server is currently in a box.
1999-07-12 20:20:56 +00:00
Rasmus Lerdorf 2b2b3147de Finish porting aspell - tested and works ok now 1999-07-12 19:18:07 +00:00
Andi Gutmans 4dc22e32b6 - Fixed a purify warning 1999-07-12 18:07:01 +00:00
Sascha Schumann fa764cb027 update 1999-07-12 17:21:49 +00:00
Andrey Hristov be66f224b0 *** empty log message *** 1999-07-12 17:16:14 +00:00
Andrey Hristov c37ceccb54 *** empty log message *** 1999-07-12 17:07:34 +00:00
Andi Gutmans fdce4ae1da *** empty log message *** 1999-07-12 17:04:55 +00:00
Sascha Schumann 81b5402a16 test commit (new format inspired by FreeBSD cvs-all) 1999-07-12 14:19:27 +00:00
Thies C. Arntzen f40a16bac9 destructors should return 1, shouldn't they? 1999-07-12 13:56:29 +00:00
Thies C. Arntzen 9b85ba490e par with 3.0 1999-07-12 13:26:56 +00:00
Thies C. Arntzen d4fb7d9e37 fixed mem-problem 1999-07-12 11:49:32 +00:00
Thies C. Arntzen 5a288ffdc8 small php4 fixes 1999-07-12 10:36:19 +00:00
Sascha Schumann a80609c773 typo 1999-07-11 10:52:14 +00:00
Sascha Schumann f0febf044f merge in some autoconf stuff 1999-07-11 10:51:41 +00:00
Zeev Suraski 3b037ebbe9 Oh, that dumb bug. 1999-07-10 22:50:44 +00:00
Andi Gutmans 44947bf563 Ok, so we do have to lock in there 1999-07-10 18:46:20 +00:00
Andi Gutmans fb7a4b6486 Fix assignments of reference variables 1999-07-10 16:56:56 +00:00
Zeev Suraski dc933fc50b Woops, fix. 1999-07-10 12:44:56 +00:00
Zeev Suraski 909590ba7b Put the garbage in the garbage bin 1999-07-10 11:47:16 +00:00
Zeev Suraski cccd2445ee Get rid of AiCount completely 1999-07-10 11:45:23 +00:00
Zeev Suraski 82563bde60 Final tweaks 1999-07-10 10:55:55 +00:00
Zeev Suraski 03d33b2f88 More locking work 1999-07-10 09:29:02 +00:00
Zeev Suraski 6fcf8aa12c *** empty log message *** 1999-07-09 21:00:24 +00:00
Zeev Suraski 0fadd053fa More stuff 1999-07-09 20:57:29 +00:00
Zeev Suraski c43c235427 Don't touch refcount and EA directly 1999-07-09 20:45:55 +00:00
Zeev Suraski 2a6da7814c Step 4:
Move to a 7-bit counter (not fully implemented yet)
1999-07-09 20:43:59 +00:00
Zeev Suraski 6ec1acbe32 Phase 3:
Use a single bit to mark IS_REF variables
1999-07-09 18:19:48 +00:00
Zeev Suraski 5f62c347c7 Step 2:
Rename is_ref to EA
1999-07-09 17:44:41 +00:00
Zeev Suraski 3a9cb0220c Step 1 in nuking the garbage collector:
- Change the hash destructor to return int
1999-07-09 17:36:12 +00:00
Zeev Suraski 81d901b14d Step 1 in nuking the garbage collector:
- Change the hash destructor to return int
- Don't kill the bucket on hash_destroy if the destructor returns 0
1999-07-09 17:24:47 +00:00
Rasmus Lerdorf db1e0bc820 Add Aspell module 1999-07-09 14:56:33 +00:00
Zeev Suraski cdce334c56 *** empty log message *** 1999-07-09 11:19:38 +00:00
Zeev Suraski cc26d0e609 Send a SIGSEGV instead of exiting, to trigger a core dump 1999-07-09 11:10:19 +00:00
Zeev Suraski 6abe9c34d9 * Support recoverable failure from erealloc()
* Fix the shutdown code on an unrecoverable erealloc() failure
1999-07-09 11:03:56 +00:00
Zeev Suraski 81f5522210 Fix the mess in SIGSEGV handling, hopefully 1999-07-09 07:35:13 +00:00
Andrey Hristov 743935ca8e More cleanup. 1999-07-08 21:56:19 +00:00
Andrey Hristov cef4df1fee Reduce clutter a bit. 1999-07-08 21:42:29 +00:00
Zeev Suraski cb2a2ea9d3 *** empty log message *** 1999-07-08 19:18:42 +00:00
Zeev Suraski 1a33277e3d Avoid sending NULL argument to printf 1999-07-08 17:15:43 +00:00
Zeev Suraski d894cf44d8 Support definition of classes that are derived from classes that are defined in runtime 1999-07-08 16:55:27 +00:00
Thies C. Arntzen ff9407b56b on par with latest php3 1999-07-08 14:12:07 +00:00
Andrey Hristov e88d121be1 Fix a memory leak by not allowing session_start() to be called more than once. 1999-07-07 21:50:33 +00:00
Sascha Schumann fdc1b9262d enable it, until we find a better way 1999-07-06 21:02:07 +00:00
Sascha Schumann da155aae1c add sendmail 1999-07-06 20:29:16 +00:00
Zeev Suraski 5baaa716dc Support PCRE under Win32 1999-07-06 19:49:48 +00:00
Zeev Suraski 8ee9fd5768 avoid two copies of pcre.c in the repository 1999-07-06 19:24:13 +00:00
Sascha Schumann 52308cd368 make Solaris gcc happy 1999-07-05 17:05:38 +00:00
Andrey Hristov 7aa981f5b7 Correct option caching 1999-07-05 15:25:51 +00:00
Sascha Schumann f6164dbf3a use void * instead of long for 64-bit test 1999-07-05 10:51:11 +00:00
Thies C. Arntzen 0e3f5a69f7 ups 1999-07-05 09:33:47 +00:00
Thies C. Arntzen 8788f30c12 fixed mem-leak 1999-07-05 08:49:13 +00:00
Thies C. Arntzen ad0076ee53 ported IPTC fro php3 1999-07-05 07:42:07 +00:00
Thies C. Arntzen e9cb3539ad added RESOURCE-returning 1999-07-05 07:03:44 +00:00
Thies C. Arntzen cab8290b8e up to php3 version
returns resources now!
1999-07-05 06:29:04 +00:00
Thies C. Arntzen eb5c6da5a4 added RETVAL_RESOURCE and RETURN_RESOURCE 1999-07-05 06:26:29 +00:00
Zeev Suraski d189972737 Make convert_to_string() regard false as "" instead of "0" 1999-07-04 23:50:58 +00:00
Thies C. Arntzen 745c5efc37 updated to latest php3 1999-07-04 13:30:13 +00:00
Zeev Suraski dbb24c2e0e *** empty log message *** 1999-07-03 23:43:02 +00:00
Zeev Suraski 6132bc3111 Support x-httpd-php-source 1999-07-03 23:15:10 +00:00
Sascha Schumann 377d7d599d *** empty log message *** 1999-07-03 22:05:56 +00:00
Sascha Schumann 6dd7254b39 remove cvsignore files as well 1999-07-03 19:46:32 +00:00
Sascha Schumann c2b8a4667b don't wipe files for distributions 1999-07-03 19:37:55 +00:00
Sascha Schumann 012e1abb4f 'make dist' builds an easy distributable tarball 1999-07-03 19:35:08 +00:00
Sascha Schumann c56116029d add missing include 1999-07-03 19:08:03 +00:00
Sascha Schumann d6169276dd checking for ints won't work, since they are 32 bit on both platforms 1999-07-03 18:46:10 +00:00
Sascha Schumann 9fbbc53008 ignore this 1999-07-03 18:31:58 +00:00
Sascha Schumann daca96353e would be logical to enable display source mode 1999-07-03 18:13:43 +00:00
Zeev Suraski baa75917c8 Support isset()/empty() for string offsets 1999-07-03 18:03:02 +00:00
Sascha Schumann a010baa18d ar t is a little bit noisy on Rhapsody 1999-07-03 17:44:20 +00:00
Zeev Suraski 063051d6ac Fix a crash 1999-07-03 16:05:58 +00:00
Sascha Schumann 22ba66b7f6 almost no config.m4 substitutes these anymore. 1999-07-03 15:42:28 +00:00
Sascha Schumann 6f3b0f799b work around the Apache problem that it pollutes the namespace 1999-07-03 03:34:47 +00:00
Sascha Schumann 7bbd454143 add usual rhapsody hack 1999-07-03 02:45:46 +00:00
Sascha Schumann e0fff74d41 missing DL_HANDLE broke build 1999-07-03 02:44:11 +00:00
Sascha Schumann e08182156e there must be a better way 1999-07-03 02:36:56 +00:00
Sascha Schumann 8b51ad8157 typo 1999-07-03 02:34:09 +00:00
Sascha Schumann 081da5006e let's start OS X hacking 1999-07-03 01:28:31 +00:00
Sascha Schumann 2f92fc0326 .. 1999-07-02 23:56:02 +00:00
Sascha Schumann 73b9beff19 ... 1999-07-02 23:55:45 +00:00
Sascha Schumann eef062572a . 1999-07-02 23:51:01 +00:00
Sascha Schumann aa485e9161 test commit 1999-07-02 23:32:55 +00:00
Sascha Schumann 72aa9e2e2b test commit 1999-07-02 23:31:25 +00:00
Sascha Schumann 2a44f45cbe workaround for 64-bit platforms 1999-07-02 21:12:03 +00:00
Thies C. Arntzen 45386d8af4 added some refcount stuff 1999-07-02 15:45:52 +00:00
Thies C. Arntzen d00b516f84 losses memory like hell, but seems to work!
3 things (this is a bad hack as of now!):
- xml.c uses _php3_strtoupper
  is #include "../standard/php3_string.h" the right way to get the prototype?

- i've copied php3i_long_pval/php3i_string_pval from the php3 tree into
  xml.c (this is defnetly WRONG, but where do i find those?)

- as php3tls_pval_destructor is not available in zend, i've
  #define php3tls_pval_destructor(a) pval_destructor(a) which is maybe not what we want!
1999-07-02 15:31:02 +00:00
Sascha Schumann c42305c54e fix from php3 1999-07-02 14:37:36 +00:00
Zeev Suraski 9ece796086 define zend_bool 1999-07-02 14:10:57 +00:00
Sascha Schumann 900850497d suppress No such file or directory 1999-07-02 13:59:51 +00:00
Sascha Schumann 03e16899bc someone please try whether the autoconf stuff works
for sybase and sybase-ct - I've neither one.
1999-07-01 15:48:57 +00:00
Sascha Schumann 2d185cc7e2 maybe fix, following Joey's description 1999-07-01 15:42:29 +00:00
Sascha Schumann 973f679df0 --with-zlib should work now 1999-07-01 15:39:58 +00:00
Thies C. Arntzen fe4efa91c3 changed boolean behaviour:
var_dump(
1999-07-01 09:26:05 +00:00
Sascha Schumann 2e690ac4b5 some additional consts 1999-07-01 05:47:06 +00:00
Sascha Schumann 2397e5d419 vpath thingie 1999-07-01 05:45:58 +00:00
Sascha Schumann 1f02914005 implement a simple API in the case someone wants to define his/her own serialization stuff 1999-07-01 05:45:48 +00:00
Zeev Suraski 49d98c5a3f Make require accept any parameter 1999-06-30 17:17:39 +00:00
Zeev Suraski 258d427647 No need for a PSLS_FETCH() if PSLS_D/PSLS_DC are supplied as function arguments 1999-06-29 22:08:07 +00:00
Andrey Hristov 3e5f7a806f *** empty log message *** 1999-06-29 15:40:11 +00:00
Andrey Hristov 88ed2002da Added session expiration. 1999-06-29 15:39:59 +00:00
Thies C. Arntzen d5fc465a67 synced with 3.0.11
ora_bind works!
1999-06-29 15:16:38 +00:00
Zeev Suraski 6a2b28ba51 No need for that either... 1999-06-28 21:42:29 +00:00
Rasmus Lerdorf 335078b4fd Don't break the tree 1999-06-28 18:59:44 +00:00
Andrey Hristov a6aacfd2b6 Added session_is_registered(varname) function. 1999-06-28 15:46:56 +00:00
Andrey Hristov 17f725d21a Ported MYSQL_NUM, MYSQL_ASSOC, and MYSQL_BOTH additions from php3. 1999-06-28 15:08:28 +00:00
Andrey Hristov 26a7fe78f2 oops 1999-06-28 13:46:58 +00:00
Andrey Hristov db400222ff *** empty log message *** 1999-06-28 13:39:52 +00:00
Sascha Schumann 650986c8d1 work around that solaris bug 1999-06-28 13:37:59 +00:00
Sascha Schumann bd031b0422 ugly and working 1999-06-28 03:01:48 +00:00
Sascha Schumann 30e80d1a8c BSD derived tests want -h for symlink test 1999-06-28 02:57:08 +00:00
Sascha Schumann 8ba3889572 port 1999-06-27 21:46:34 +00:00
Sascha Schumann e205a6749d more porting 1999-06-27 21:45:06 +00:00
Sascha Schumann d819da4897 port Rasmus' APXS changes for AIX 1999-06-27 21:36:00 +00:00
Sascha Schumann fa7cba7d5d port over from php3 1999-06-27 21:23:17 +00:00
Sascha Schumann adde17749b lex optimizations 1999-06-27 21:18:43 +00:00
Sascha Schumann 3b36670df1 add dbase_replace_record 1999-06-27 21:15:12 +00:00
Sascha Schumann aa4e00b33c port over autoconf fixes from php3 1999-06-27 21:14:00 +00:00
Zeev Suraski d1169e735e Win32/general patches 1999-06-26 23:21:18 +00:00
Zeev Suraski d4f24f19ad * Get rid of another request_info element (filename)
* CGI through Apache should work now
1999-06-26 19:14:26 +00:00
Zeev Suraski 320541430b *** empty log message *** 1999-06-26 18:01:21 +00:00
Zeev Suraski 36416f1109 Protect against NULL arguments in filename 1999-06-26 12:27:49 +00:00
Zeev Suraski 98b6ddda90 * Make the memory leak reporting code much better with repeats
* Remove useless variables
1999-06-26 11:48:22 +00:00
Sascha Schumann 6ec7163796 add dmalloc 1999-06-26 00:34:36 +00:00
Sascha Schumann f3ef2ff1d0 - APXS link thingie
- functions/ game obsolete. Should make compiling faster on slow machines (hi Kristian :-)
1999-06-25 23:40:26 +00:00
Andrey Hristov d41af4b7eb *** empty log message *** 1999-06-23 15:04:21 +00:00
Thies C. Arntzen 18962f1993 gettype now reports "boolean" correct 1999-06-22 21:37:43 +00:00
Zeev Suraski c471c77c58 Fix Thies's bug report 1999-06-22 20:24:51 +00:00
Andrey Hristov df86725019 Making function accessible. 1999-06-22 19:37:26 +00:00
Andrey Hristov 226f75e0f3 Making the function accessible. 1999-06-22 19:36:52 +00:00
Zeev Suraski acddd0f13c Fix compile-time definition of track_vars default 1999-06-22 19:07:01 +00:00
Zeev Suraski 3eac45ea80 * Fix concatenation of arrays (it was PHP 3.0 style, copying zval's instead
of zval *, and it wasn't using reference counting)
* Fix a memory leak in static array()'s with textual indices
1999-06-22 19:05:40 +00:00
Andrey Hristov 31c8ec4c80 Made preg_split() consistent with split().
Added a new /e modifier for preg_replace
Kill a warning in pcrelib.
1999-06-22 14:56:32 +00:00
Thies C. Arntzen 5fa6882567 urlencode and decode return an empty-string if the input-string is empty (matches php3 behaviour "more" closly)
Please read my previous mail and comment!
1999-06-22 13:35:28 +00:00
Stig Bakken 8139b776e9 cosmetics 1999-06-22 11:04:35 +00:00
Danny Heijl bc50e68a1b Bad html in ifx_htmltbl_result(). 1999-06-22 07:14:55 +00:00
Stig Bakken 7f8e11d6d3 fix some potential buffer overflows 1999-06-22 01:59:30 +00:00
Andrey Hristov 2b8c85bd0b Backing out changes. 1999-06-21 23:07:46 +00:00
Thies C. Arntzen 8052667684 fixed implode "again" - 1999-06-21 15:57:20 +00:00
Sascha Schumann af56b0f936 whoops, kill debugging message 1999-06-20 18:54:08 +00:00
Sascha Schumann 43a466a076 Introduce AC_ADD_* macros
The use of AC_EXPAND_PATH makes it possible to continue
to use relative paths when configuring PHP.
(e.g. --with-apache=../apache-1.3.x works again)
1999-06-20 18:52:46 +00:00
Sascha Schumann 2b97cb1f88 avoid error message 1999-06-20 17:15:29 +00:00
Sascha Schumann c3151f742b use standard autoconf variables 1999-06-20 17:04:30 +00:00
Zeev Suraski 943a911485 *** empty log message *** 1999-06-19 22:56:34 +00:00
Zeev Suraski d035af4af1 *** empty log message *** 1999-06-19 20:42:15 +00:00
Zeev Suraski 138d601ab1 Add a standard get_ini_entry() to interface between Zend and the outside world 1999-06-19 20:22:56 +00:00
Zeev Suraski bb190f8565 Implement new get_ini_entry() for Zend 1999-06-19 19:23:24 +00:00
Zeev Suraski 8def18813f *** empty log message *** 1999-06-19 14:07:48 +00:00
Zeev Suraski 57882d58e1 Use php.ini instead of php3.ini 1999-06-19 13:18:48 +00:00
Zeev Suraski 63a845f2f6 *** empty log message *** 1999-06-19 13:13:28 +00:00
Zeev Suraski f88464ee6d Win32/ZTS compiles again 1999-06-19 13:04:55 +00:00
Andrey Hristov cd74a455dd for struct sockaddr 1999-06-18 15:54:14 +00:00
Stig Bakken 62fc2f5f7f update php3 sync info 1999-06-18 14:45:48 +00:00
Stig Bakken d92c591514 optimize php3_fopen_url_wrapper() a bit (fewer recv() and send() calls) 1999-06-18 14:22:59 +00:00
Stig Bakken 467523bac5 Apply Sascha's fsock fixes to php4. 1999-06-18 13:42:21 +00:00
Stig Bakken 2ca5404046 make CGI version work again 1999-06-18 13:02:34 +00:00
Sascha Schumann 5d62d88ece typo 1999-06-17 15:45:26 +00:00
Andrey Hristov 14463b1ba8 Need to check if it exists first. 1999-06-17 15:17:17 +00:00
Zeev Suraski a22d6b980e Win32 patches (does not compile still) 1999-06-17 03:45:20 +00:00
Stig Bakken 27f1799b68 MIME headers may be 512 characters long. 1999-06-16 18:43:59 +00:00
Stig Bakken 117a2fba07 * fixed some #if/#ifdef issues
* hand-patched in php3 changes from 3.0.6 to HEAD in these files:
   fopen-wrappers.[ch] ext/standard/file.[ch] ext/standard/fsock.[ch]
   ext/standard/php3_string.h ext/standard/string.c
* added some new file/socket macros for more readable code:
   FP_FGETS(buf,len,sock,fp,issock)
   FP_FREAD(buf,len,sock,fp,issock)
   FP_FEOF(sock,fp,issock)
   FP_FGETC(sock,fp,issock)
1999-06-16 17:06:53 +00:00
Stig S. Bakken 5d4579a1f4 added INIT_FUNC_ARGS_PASSTHRU and SHUTDOWN_FUNC_ARGS_PASSTHRU 1999-06-16 11:03:57 +00:00
Stig S. Bakken 80f1ce5eed * added zend_binary_strcasecmp() 1999-06-15 22:32:51 +00:00
Stig Bakken 8eec7a022f reversing another patch that slipped 1999-06-15 21:56:11 +00:00
Stig Bakken 8c4411b5da * reverse fsock/string import patches 1999-06-15 21:51:00 +00:00
Zeev Suraski f86fb810a0 Change four spaces back to tabs (Why the hell did you change the tabs to four spaces?!) 1999-06-15 19:05:01 +00:00
Stig Bakken 336392ea6c * now using php4.ini instead of php3.ini
* re-imported fopen-wrappers, fsock and string code from php3
  NB!  I have not tested all of the imported functions yet.
1999-06-15 17:06:22 +00:00
Stig Bakken 7719f86292 fix some .cvsignore files 1999-06-15 17:00:39 +00:00
Rasmus Lerdorf bdbdaa4369 gmmktime() fix 1999-06-15 12:31:29 +00:00
Andrey Hristov 215a88ade1 Need to test for directory. 1999-06-14 15:05:55 +00:00
Stig Bakken a916379c21 make symlinks if they are not present already 1999-06-14 13:59:18 +00:00
Zeev Suraski 96bfbc7904 First attempt at moving the old RFC1867 support to the right place 1999-06-12 17:50:39 +00:00
Zeev Suraski c50cd2df99 We can't quite go with expr there (shift/reduce conflict), go with scalar. 1999-06-12 07:43:36 +00:00
Zeev Suraski 4bf413e358 require() improvement as per Andi's suggestion 1999-06-12 06:59:54 +00:00
Sascha Schumann be14ccadf1 it's obj.properties, not ht 1999-06-11 19:29:10 +00:00
Andrey Hristov 8c43c5f708 Fix up var.c a bit. 1999-06-11 15:54:06 +00:00
Zeev Suraski 0d560de1b7 Make the concatenation operator use make_printable as well 1999-06-11 15:37:43 +00:00
Zeev Suraski 9f106c61ec Don't take failing on an include file so badly 1999-06-11 14:51:44 +00:00
Zeev Suraski d6595d628c Support <?= 1999-06-11 13:56:04 +00:00
Zeev Suraski d47d83511a E_ERROR -> E_COMPILE_ERROR in the compiler 1999-06-11 13:40:18 +00:00
Zeev Suraski 54d210427a Two fixes:
* The error generated by a failed class inheritence wasn't  properly
  displaying the file in which he error occured.
* Inheritence didn't work if the parent class had uppercase letters in it.
1999-06-11 13:37:29 +00:00
Rasmus Lerdorf f8bac0f8ad Same Fix here 1999-06-11 12:48:22 +00:00
Stig Bakken 6b16188db0 append DEBUG_CFLAGS to CFLAGS 1999-06-11 12:22:53 +00:00
Zeev Suraski 4b062fdfec Print out include_path in include/require failures 1999-06-11 11:59:35 +00:00
Zeev Suraski 963a004481 * Use to_string() instead of __print()
* Support boolean casts ((bool) and (boolean))
1999-06-11 11:17:43 +00:00
Zeev Suraski 99fd17df63 Change __print into to_string() 1999-06-11 11:02:38 +00:00
Zeev Suraski da9faa2c3a * Make the output handling of variables much, much cooler.
Uses zend_make_printable_zval() instead of convert_to_string() now:

$foo = true;
print "\$foo is $foo";
will now print
$foo is true
(instead of "$foo is 1", earlier).

Also, with objects, it automatically tries to call __print() and use it as a printing
function.

For example:

class foo {
  function __print() { return "Foo Object"; }
};

$foo = new foo;
print $foo;

will print "Foo Object".
1999-06-11 10:44:26 +00:00
Zeev Suraski 1798a0183a * Fix a buglet in the session module
* Make some renames in the session module - avoid having a function called 'delete'
  so that we don't piss any C++ compilers.  Also rename the {startup,shutdown}_globals
  to {startup,shutdown}_session_globals, so that they're a bit less general names,
  and made them static.
* Remove uselss variables
1999-06-11 09:23:00 +00:00
Zeev Suraski c1f75b6fda Now THAT's an annoying bug. 1999-06-10 23:03:35 +00:00
Sascha Schumann 83de88e90c make serialize work
unserialize does not work yet
1999-06-10 15:34:20 +00:00
Andrey Hristov 2bb01b6f81 Fixing serialize a bit. 1999-06-10 15:13:26 +00:00
Andrey Hristov 3b1843bc9f Added preg_grep() function. 1999-06-10 14:41:38 +00:00
Frank M. Kromann f6ad4b09c1 Sync. with php3. Only add Date: and From: if not supplied by user 1999-06-10 09:10:07 +00:00
Andrey Hristov f7072fbf87 Make array_shift/array_pop work better. 1999-06-09 22:03:15 +00:00
Zeev Suraski 2fb5e56123 Fix 1999-06-09 21:40:52 +00:00
Zeev Suraski 95c9e3014a * Fix cases where you assign an array element to the parent array (the array was
being erased before the assignment, so the element was being smashed).
1999-06-09 21:39:12 +00:00
Andrey Hristov b331ead5bf A fix for a fix. 1999-06-09 21:21:27 +00:00
Andrey Hristov 3d45dd58b8 Fixed a bug in preg_split.
Fixed a bug in array_shift/array_pop.
1999-06-09 21:13:05 +00:00
Zeev Suraski b484f40c31 * Fix foreach() that receives a non array argument
* Clean up some C++ comments
1999-06-09 21:02:59 +00:00
Thies C. Arntzen a3464b7c11 oci8 to 3.0.9
implode works!
1999-06-09 19:47:06 +00:00
Andi Gutmans 7ed4923441 - Fix the static array() initializing 1999-06-09 19:26:54 +00:00
Andrey Hristov 835b0d8823 *** empty log message *** 1999-06-09 15:39:56 +00:00
Andrey Hristov 2a64925a67 Fixed a bug in preg_replace. 1999-06-09 15:02:57 +00:00
Thies C. Arntzen e5da9fc10a up to 3.0.9 1999-06-09 10:40:08 +00:00
Danny Heijl f3d179ff99 resync informix driver with php 3.09 version 1999-06-09 07:44:52 +00:00
Zeev Suraski 230846f6dd Replace error messages 1999-06-08 19:37:40 +00:00
Andi Gutmans 04b2c1d422 * Fix a by-name call/method call bug
* Clean and optimize the whole function call process
1999-06-08 18:33:31 +00:00
Zeev Suraski fd4650b540 Add zend_hash_get_current_key_type() 1999-06-07 22:49:33 +00:00
Sascha Schumann 4b023c157a better scaling for large servers using many session ids 1999-06-07 19:51:54 +00:00
Andrey Hristov bc1e4a5a10 Don't set is_ref in _phpi_splice()
More checking in array_merge()
Added keys() and values() array functions.
1999-06-07 18:52:20 +00:00
Sascha Schumann d8a9548cb2 - some cleanups
- add gc logic
- add session_destroy()
1999-06-07 16:43:24 +00:00
Zeev Suraski b886985d63 Fix an ereg_replace() crash bug 1999-06-07 15:01:25 +00:00
Zeev Suraski 34b3dc9b47 - Fix PSLS issues
- Add a standard info function for the session module (use them!)
- Replace PATH_MAX with MAXPATHLEN (that's our platform indepedent constant)
1999-06-06 19:53:59 +00:00
Sascha Schumann 82806ea254 one C too much 1999-06-06 19:26:31 +00:00
Sascha Schumann e9b28fe29c avoid unnecessary PSLS_FETCH() in internal functions 1999-06-06 19:25:39 +00:00
Andi Gutmans f5dbfbae84 -Init tsrm on minit 1999-06-06 18:56:11 +00:00
Andi Gutmans ed97964fbe - Use PS() everywhere. 1999-06-06 18:39:48 +00:00
Andi Gutmans c329da5d25 - Make sessions compile on win32 but it still doesn't link. 1999-06-06 18:36:42 +00:00
Andi Gutmans c5fd7244dd - Add some *_FETCH()'s. Still some work to be done so that it'll compile on win32. 1999-06-06 18:22:17 +00:00
Andi Gutmans 5b0ae2dff3 Work around a compiler bug - mark variables that are sent to functions that aren't yet
defined as FETCH_W (because they might end up being sent by reference)
1999-06-06 17:35:42 +00:00
Sascha Schumann 605756de7f - s/encoded/encode/
- new TODO entry
1999-06-06 15:18:51 +00:00
Andi Gutmans d5dc2cd22c - Remove the is_ref =1 from the push() function. 1999-06-06 15:00:49 +00:00
Sascha Schumann a821a185e4 add some protos 1999-06-06 14:19:55 +00:00
Sascha Schumann 2f79ba1abf add some thoughts 1999-06-06 14:02:13 +00:00
Sascha Schumann 19a2a02f8e - auto startup when calling register
- auto startup using a configuration option
1999-06-05 22:24:59 +00:00
Sascha Schumann f830cf7d15 moving start code into its own function 1999-06-05 22:15:49 +00:00
Andrey Hristov f8f8defb42 Added array_merge() function. 1999-06-05 21:19:25 +00:00
Sascha Schumann 2db1d61718 SAPI does not want line endings 1999-06-05 20:51:29 +00:00
Andrey Hristov 421414df03 Added push(), pop(), shift(), unshift(), splice(), and slice() array functions.
The first 5 work like their Perl counterparts. slice() returns a chunk of the array
specified by offset and length arguments.

Backport to PHP3 and docs will be coming soon.
1999-06-05 20:43:36 +00:00
Zeev Suraski ed06a70f7f * Centralized shutdown
* Change shutdown order again
1999-06-05 20:00:00 +00:00
Sascha Schumann a1b42e3f5e first import of session module 1999-06-05 19:52:58 +00:00
Zeev Suraski 89f139d3b0 Call the request_shutdown on modules before destroying symbol tables, so that
the session module can be implemented
1999-06-05 19:10:40 +00:00
Zeev Suraski bbce669cea Move shutdown order into Zend 1999-06-05 19:00:56 +00:00
Zeev Suraski 8b2fe60467 - Fixed Karl's bug report. It's not really a thorough fix, we really need to rethink the INIT_FCALL/DO_FCALL issue.
- Fixed numerous AiCount problems
1999-06-05 18:47:36 +00:00
Zeev Suraski e49aafcf57 I got the order wrong earlier :I 1999-06-05 17:47:16 +00:00
Zeev Suraski e586468a4e Not sure that's the right fix, but at least it fixes the symptom 1999-06-05 13:56:18 +00:00
Sascha Schumann 92f986787b add some .cvsignores 1999-06-05 10:48:05 +00:00
Andrey Hristov dbfeaabb16 Added preg_quote() function. 1999-06-04 13:56:23 +00:00
Andrey Hristov c7a606c4a3 *** empty log message *** 1999-06-04 13:37:44 +00:00
Zeev Suraski 1b4b5c4a88 New $GLOBALS init 1999-06-04 13:09:24 +00:00
Zeev Suraski 1ecca4b8e8 Fix UNIX MySQL build 1999-06-04 12:51:41 +00:00
Zeev Suraski cf757f7c89 Fix that GLOBALS leak. We were explicitly adding GLOBALS to the main symbol table,
but there's no reason to do it (INIT_GLOBALS takes care of it if necessary.)
1999-06-04 12:22:19 +00:00
Zeev Suraski b6315d1c9b Remove old workspaces 1999-06-04 12:13:18 +00:00
Zeev Suraski 9108abc287 Minor updates (mostly __declspec() stuff) 1999-06-04 11:44:02 +00:00
Zeev Suraski 3cad348509 * Add a new workspace for dynamic PHP extensions.
* Add a few functions to PHP's API.
* Get the MySQL extension up-to-date and thread safe.
* Add a project for building the MySQL extension under Win32.
1999-06-04 10:45:54 +00:00
Thies C. Arntzen a3a60dd4e7 added is_ref=0 and refcount=1 to SET_VAR_* macros 1999-06-04 09:04:05 +00:00
Zeev Suraski 66a48f2131 T_BAD_CHARACTER is actually a string. 1999-06-03 23:59:33 +00:00
Andi Gutmans 1225d0307b - We weren't counting newlines in heredocs. The only place which is still questionable
is when there's a \ followed by a newline but it seems we have a parse error in this
case anyways.
- Fixed the alloca() macros so that the alloca() #define in win32 mode won't clash
with the real win32 alloca().
1999-06-03 21:06:03 +00:00
Andrey Hristov 0f99eeb29f function dir doesn't exist anymore 1999-06-01 21:01:02 +00:00
Andrey Hristov aea7498779 *** empty log message *** 1999-06-01 20:31:39 +00:00
Andi Gutmans c4b7426ec1 - Make execute() use less stack in thread-safe win32 due to Microsoft's shitty 256kb stack. 1999-06-01 18:47:53 +00:00
Sascha Schumann d57ffd3646 avoid touching libraries which have not changed 1999-06-01 17:53:15 +00:00
Andi Gutmans 250d803c31 - Fix for exec to use API 1999-06-01 16:41:56 +00:00
Zeev Suraski 4ea6d477ec thread-safety fix 1999-05-31 19:58:20 +00:00
Zeev Suraski 63f2cc9fe9 *** empty log message *** 1999-05-31 18:39:29 +00:00
Andi Gutmans 52ec64359c Fixes 1999-05-31 18:33:12 +00:00
Andi Gutmans f153896de5 *** empty log message *** 1999-05-31 17:41:41 +00:00
Zeev Suraski 5f12a05aa3 *** empty log message *** 1999-05-31 17:40:15 +00:00
Andrey Hristov aba3ea97cd preg_match_all() now returns the number of global matches. 1999-05-30 14:48:39 +00:00
Sascha Schumann 88029643d0 * fix some casts
* introduce unary_op_type - cleaner than casting data voids to function ptrs
1999-05-30 13:28:56 +00:00
Sascha Schumann 31da7331fe kill some warnings 1999-05-30 12:00:06 +00:00
Sascha Schumann 577340bb9f zend_hash_merge was changed 1999-05-30 11:57:28 +00:00
Zeev Suraski cf4a2c3bfc That got fucked up when we went back to using uninitialized_zval 1999-05-29 23:37:26 +00:00
Sascha Schumann b5dd397459 another VPATH related change 1999-05-29 23:20:55 +00:00
Zeev Suraski f78d4f1a56 Fix a bug 1999-05-29 22:26:28 +00:00
Andrey Hristov a88b37788e Updated preg_split(). 1999-05-29 20:45:00 +00:00
Andrey Hristov 70dc46892a Fix preg_match_all to do proper matching with \b. 1999-05-29 20:04:05 +00:00
Andrey Hristov 9c970e1910 Fixed PCRE so that global matching with patterns with \b works. 1999-05-29 19:38:50 +00:00
Zeev Suraski e058cccfc1 * Changed the way INI entries work in Apache to allow .conf entries to work right too.
* vpath fixes for standard Apache build
1999-05-29 19:06:22 +00:00
Zeev Suraski bcc1337d8c Support overwrite mode in zend_hash_merge() 1999-05-29 18:59:58 +00:00
Zeev Suraski 274f3aa727 Fix 1999-05-29 18:28:46 +00:00
Sascha Schumann 33507acca5 - clean is not called from automake. use CLEANFILES instead
- allow VPATH compilation
1999-05-29 18:13:14 +00:00
Sascha Schumann 03d2a11e27 more VPATH work 1999-05-29 18:11:49 +00:00
Sascha Schumann 6ebb2c80e0 kill warning 1999-05-29 16:20:55 +00:00
Sascha Schumann 941bdd57a3 - fix APXS VPATH build
- libzend/TSRM build in their own directories
- ext/Makefile was generated twice

****NOTE******

If you use any kind of VPATH, you need to do a "make distclean" in your
libzend/TSRM directory, before running configure again.
1999-05-29 16:15:21 +00:00
Zeev Suraski e9c646e7dd avoid crashing with php4 directives in .conf files (they still don't work) 1999-05-29 16:03:49 +00:00
Zeev Suraski 873763473f fixes 1999-05-29 15:10:06 +00:00
Sascha Schumann 52463124be getopt.h conflicted with system include file 1999-05-29 13:53:59 +00:00
Sascha Schumann b219d491b9 . 1999-05-29 12:15:04 +00:00
Zeev Suraski b7ee45e13c Correct fix 1999-05-29 12:00:32 +00:00
Zeev Suraski 7068d4a201 *** empty log message *** 1999-05-29 11:02:37 +00:00
Zeev Suraski 24a21ca2e1 Fix a leak 1999-05-29 11:01:50 +00:00
Zeev Suraski c1dc4efc3b no need for those 1999-05-28 22:42:17 +00:00
Zeev Suraski 0eb1498fa8 * Get Apache module to compile again with the regex stuff.
* Get Apache to propertly work with POST, and some SAPI fixes
1999-05-28 22:41:48 +00:00
Sascha Schumann dfce358a5b that seems to fix it 1999-05-28 21:41:17 +00:00
Sascha Schumann 7401ef12fb Either I'm playing the EG(symbol_table) game wrong or var.c leaks memory
when unserializing arrays/objects. Still testing
1999-05-28 21:27:19 +00:00
Andrey Hristov 3fe94e5b37 -Modified PCRE library slightly to do what needs to be done
-Updated preg_replace() code to handle stuff properly
-Removed ability to specify external PCRE library source to link against
(since our bundled version is patched now)
1999-05-28 20:54:52 +00:00
Sascha Schumann 62a9f2137c I think that is the preferred way as of now 1999-05-28 18:51:51 +00:00
Zeev Suraski cd789db6f2 *** empty log message *** 1999-05-28 13:28:50 +00:00
Zeev Suraski 741b816136 * Support getThis() for internal functions.
* Fix 'new object or die' and AiCount issue thoroughly (earlier fix didn't
  work with the optimizer).
* Add new macros for standardized definition of classes.
* Only report AiCount problems if shutdown was not silent.
1999-05-28 12:06:59 +00:00
Zeev Suraski 7a167cd0c1 * Use new Zend macros for standardized definition of classes.
* Reverse bogus shutdown order.
* Use the new object/class support of Zend to make the dir functions work again.
1999-05-28 11:09:39 +00:00
Rasmus Lerdorf f1f4e6f478 Some innocent cleanups 1999-05-28 03:54:15 +00:00
Andrey Hristov a5138d2724 We don't need those there. 1999-05-27 14:02:29 +00:00
Andrey Hristov e10e4dbe10 Really fix the configuration now so that it's possible to compile both
against the bundled PCRE library and the one external to the source tree.
Crossing my fingers while Zeev compiles this. :)
1999-05-27 13:59:39 +00:00
Stig Bakken 96434e4899 self-contained extensions please :-) 1999-05-27 08:53:21 +00:00
Zeev Suraski 83cdc9476d Generate Visual Studio compatible error messages when compiling under Win32 1999-05-27 03:14:57 +00:00
Zeev Suraski 3b5972ed4a Fix the AiCount issue with objects 1999-05-27 03:11:08 +00:00
Zeev Suraski 1f985ede74 Moved all #define's for SET_ and RETURN_ to zend_API.h 1999-05-27 01:44:17 +00:00
Sascha Schumann 5d0a7599a9 - fix CGI build (at least) 1999-05-27 01:34:18 +00:00
Sascha Schumann 16ec4608ac add rfc1867.c 1999-05-27 01:20:52 +00:00
Zeev Suraski 36947fc45a Fix pcre build 1999-05-27 01:19:00 +00:00
Zeev Suraski 064a16c7b2 Moved all SET_ and RETURN_ macros to Zend
Fixed all RETVAL_ macros
1999-05-27 00:45:31 +00:00
Andrey Hristov 66f850e5b7 -Added PCRE library source
-Updated configuration process
1999-05-26 21:47:57 +00:00
Andrey Hristov d73c638526 Added preg_split. Same syntax as regular split(). 1999-05-26 18:59:04 +00:00
Andrey Hristov ff29e85724 Fixing a couple of long standing bugs. 1999-05-26 18:45:53 +00:00
Andrey Hristov 0062ae6218 A few changes here.
First of all, as per extensive discussion on the list, the functions are now
prefixed with "preg" instead of "pcre".

Secondly, global matching is now possible using preg_match_all.  Please, give
suggestions on a better name if this one doesn't sit well with you.  Possible
names are preg_global_match and preg_gmatch.

preg_match_all takes 4 arguments: a regex pattern, a subject string,
the array for capturing subpatterns, and a parameter that tells how the results
in the subpatterns array are arranged.

Basically, preg_match_all will go through the subject string and try to capture
all the matches that it finds, not just the first one like preg_match.

4th parameter can be PREG_PATTERN_ORDER (default) or PREG_SET_ORDER.

Example:
preg_match_all("|</?([^>]+)>|", "<div align=left>a test</div>", $out, PREG_PATTERN_ORDER);

This returns results so that $out[0] is an array of full pattern matches, $out[1] is an array
of first captured subpattern matches, and so on.

$out[0] -> ("<div align=left>", "</div>")
$out[1] -> ("div align=left", "div")

Example:
preg_match_all("|</?([^>]+)>|", "<div align=left>a test</div>", $out, PREG_SET_ORDER);

This returns results so that $out[0] is an array of first full pattern match and subpatterns,
$out[1] is an array of second full pattern match and subpatterns.

$out[0] -> ("<div align=left>", "div align=left")
$out[1] -> ("</div>", "div")

If anyone has a better name for these PREG_ constants and also which one should be the default,
I'd like to hear it.
1999-05-26 15:22:02 +00:00
Zeev Suraski 033858e13d Avoid crashing if an error occurs before we open the first file. 1999-05-25 22:55:13 +00:00
Zeev Suraski cf58b7ef16 Add container for file-upload. It's not quite implemented yet. 1999-05-25 22:28:24 +00:00
Andrey Hristov 6155d91e7a Just a little sanity check. 1999-05-25 21:47:58 +00:00
Zeev Suraski 4f545f9c6b Allow unregistering content types as well. 1999-05-25 21:19:46 +00:00
Zeev Suraski 72f6e823f9 * Add generic POST content-type support. Only application/x-www-form-urlencoded
supported at this time, but the framework allows for any other types, including
  runtime addition of types.
1999-05-25 21:14:54 +00:00
Zeev Suraski 7b98592282 include regex in Win32 build 1999-05-24 18:02:42 +00:00
Zeev Suraski e115fdc6d6 The last fix was wrong 1999-05-24 16:48:01 +00:00
Zeev Suraski cbcd462d46 Another operators fix 1999-05-24 16:43:47 +00:00
Zeev Suraski 97107dc440 boolean comparison didn't work with smaller-than and greater-than, something that
fucked up berber's site a bit.  fixed.
1999-05-23 22:07:04 +00:00
Zeev Suraski 0eb500cef5 Thou shalt use the API, and thou shalt be safe 1999-05-23 20:32:19 +00:00
Andrey Hristov 57b22c8b64 Some comments. 1999-05-22 19:46:27 +00:00
Sascha Schumann 3165710b77 - add -lregex
- change module name to php4
1999-05-22 19:41:28 +00:00
Andrey Hristov 912f17d278 Added ability to pass array parameters to pcre_replace. 1999-05-22 19:14:57 +00:00
Zeev Suraski ee7032f069 Sigh, another leak bites the dust. FREE_OP missing in case of a SEND_VAR. 1999-05-22 18:02:30 +00:00
Zeev Suraski 84bb91d762 I'm on a roll. Fix a nasty yet stupid AiCount bug 1999-05-22 17:30:09 +00:00
Zeev Suraski 05f6cf54f0 Warn about AiCount not zeroing out 1999-05-22 16:48:23 +00:00
Sascha Schumann 7b58930456 add a $(srcdir) 1999-05-22 16:13:10 +00:00
Sascha Schumann 13c3c4012e fix compile issues in LDAP/XML exts 1999-05-22 16:12:09 +00:00
Zeev Suraski 1250c43a39 * Add struct name to all typedef's so that they can be debugged with MSVC
* Fix an AiCount bug - list(...) = $var was using $var multiple times, and thus
causing AiCount to be decreased multiple times even though it was increased only
once for $var.  Mark all FETCH_DIM's so that they won't decrease AiCount, and only
decrease AiCount on the last FETCH_DIM.
* Fix a stupid bug - forgot to pass CLS_C to some compiler function.  For some reason
MSVC doesn't report these :I
1999-05-22 16:10:51 +00:00
Sascha Schumann 1652802641 fix APXS compile 1999-05-22 15:48:29 +00:00
Zeev Suraski d62a739cca More fixes. Should hopefully work well now. 1999-05-22 12:19:57 +00:00
Zeev Suraski 9df57a2263 php_ini fixes 1999-05-22 11:34:21 +00:00
Zeev Suraski 080105f79f Give more information and save log lines in memory leak reports 1999-05-22 11:20:56 +00:00
Zeev Suraski 9b4d71205b * Minor fixes
* Better handling for multiple repeated memory leaks (libzend updated)
1999-05-22 10:56:36 +00:00
Zeev Suraski a08e3925b1 Time to rename the child 1999-05-22 09:24:21 +00:00
Zeev Suraski 87ba08d1d0 Avoid leaking fd's in case of failures 1999-05-22 02:13:01 +00:00
Zeev Suraski 58a0ae7b35 Small fix 1999-05-22 01:15:25 +00:00
Zeev Suraski ac94c83867 more fixes 1999-05-22 01:07:50 +00:00
Zeev Suraski 9e862c11ec Fix a memory leak 1999-05-21 23:51:19 +00:00
Zeev Suraski d56ae4f670 That wasn't supposed to slip in 1999-05-21 23:48:24 +00:00
Zeev Suraski be8b9778e0 This should be centralized... 1999-05-21 23:25:46 +00:00
Zeev Suraski 9dc0842e58 * Properly handle failed file opens in C++
* Properly handle failed require()'s within libzend
1999-05-21 20:20:32 +00:00
Sascha Schumann 00cb03bd49 add support for mhash 0.5.0
see http://sasweb.de/mhash/
1999-05-21 20:09:23 +00:00
Andrey Hristov e3a70c1f04 -Added regex cache
-Made module thread-safe
1999-05-21 19:27:44 +00:00
Zeev Suraski c57c0e9cd5 * Fix error handling startup on the thread-safe CGI version
* A failed require() is a compile-time error, consider it as one
1999-05-21 19:22:17 +00:00
Zeev Suraski f33c22c055 * Fix the comments issue. yymore() worked like a charm.
* Change all flex states to be prefixed with ST_
1999-05-21 17:31:49 +00:00
Andrey Hristov be9dc58cfe Get rid of debug printf's. 1999-05-21 13:29:05 +00:00
Andrey Hristov 17bbbf2963 Initial check-in of PCRE (Perl Compatible Regular Expressions) extension.
PCRE library can be found at ftp://ftp.cus.cam.ac.uk/pub/software/programs/pcre/

config.m4 will be updated to be more robust later on.

perl_match() takes a regular expression, the source string, and the array
for subpattern matches.

perl_replace() takes a regular expression, the search string, and the replacement
string.

Regular expression is specified using delimiters and options.  Example:

perl_match("/<[a-z]*>/i", $text, $tags);

More stuff is coming soon.
1999-05-21 13:17:23 +00:00
Sascha Schumann b57dc27595 - run ext sources through conv_proto
- add necessary phpext_*_ptr
1999-05-21 10:06:25 +00:00
Sascha Schumann 4fe8fe715e merge in some PHP3 stuff 1999-05-21 08:37:48 +00:00
Sascha Schumann 6f06b11679 incorporate YP/NIS support 1999-05-21 08:29:51 +00:00
Sascha Schumann fb407676a2 - fix compile issues for various packages (dbase, sysv*, zlib)
- some cleanup in mhash/mcrypt
1999-05-21 08:20:13 +00:00
Sascha Schumann 0fe7fe30b5 - add phpext_pgsql_ptr
- semaphore update for glibc-2.1 systems
1999-05-21 08:04:38 +00:00
Sascha Schumann 672e38da93 Add default path for binary mysql distributions 1999-05-21 07:52:12 +00:00
Sascha Schumann 286fef1ce4 remove debug messages 1999-05-21 07:04:48 +00:00
Zeev Suraski 9cb2cf1393 Optimize allocations into uninitialized_zval assignments 1999-05-20 20:00:59 +00:00
Zeev Suraski 59a539f6ad Use OutputDebugString() or fprintf(stderr,) for memory leaks 1999-05-20 19:06:28 +00:00
Sascha Schumann 27fc61c4dc Apply the fix for feof() 1999-05-20 13:56:19 +00:00
Andi Gutmans 3facf7cb7c - Updates we did today 1999-05-20 13:04:59 +00:00
Andi Gutmans 7eef22472c - Small fixes 1999-05-20 12:06:45 +00:00
Andi Gutmans d79292d52b - Fix a small problem with class decelerations. 1999-05-20 09:08:29 +00:00
Andi Gutmans 0bc950bcd5 -Open curly braces fix? 1999-05-20 09:02:03 +00:00
Sascha Schumann db6ce2f2a9 add mhash support 1999-05-16 12:01:25 +00:00
Sascha Schumann 4e08c66771 kill another 64-bit issue.
this affected at least md5 which produced wrong values on 64-bit platforms
1999-05-16 11:55:34 +00:00
Sascha Schumann a37a5e5c4a char * => unsigned char * 1999-05-16 11:32:51 +00:00
Sascha Schumann 39691bed9e conv_proto *.[ch] 1999-05-16 11:19:26 +00:00
Sascha Schumann 5a4c63db53 this script automatically converts the ugly void php3_... prototypes
to PHP_FUNCTION(...) prototypes. Also kills some unnecessary extern
declarations in front of function prototypes.
1999-05-16 11:14:52 +00:00
Sascha Schumann ed8a7dff62 add fast bin2hex string function 1999-05-16 11:12:23 +00:00
Sascha Schumann d886b84ef4 kill some compiler warnings 1999-05-16 11:10:41 +00:00
Zeev Suraski b0bfa458b5 * Fix all hash checks that checked Bucket.arKey for NULL, when it was changed
to char[1], these checks should have been changed to Bucket.nKeyLength==0
* Support runtime declaration of functions.  I ended up changing the grammar
  to catch top level functions vs. nested functions.  The reason is simple -
  if we don't have functions properly declared at compile-time, function calls
  cannot be resolved at compile time, and have to be resolved at runtime, which
  ends up being much much slower (without the optimizer, that is).
  It's no biggy though, the grammar change isn't that bad.
1999-05-15 15:47:24 +00:00
Zeev Suraski d2c16bf5bd *** empty log message *** 1999-05-15 14:56:23 +00:00
Zeev Suraski b9fb0b8e4d If a require() dies, we must bail out (since it corrupts an existing op_array 1999-05-14 20:16:22 +00:00
Zeev Suraski 53f98a66cf Fix a bug 1999-05-14 19:04:37 +00:00
Stig S. Bakken 695b4f4d5e don't install Zend on the system 1999-05-14 18:42:06 +00:00
Zeev Suraski 1fb61df8a5 * Include all of the standard modules in internal_functions.c.in. Stig - is that
the way you intended it to be?  How does the basic_functions module get in there?
* Fix to get MySQL objects working, even though I'll probably make a dedicated
  MySQL object in the future.
1999-05-14 18:25:16 +00:00
Zeev Suraski 67296f0704 Add \012 and \xff missing support to constant quoted string 1999-05-14 11:29:34 +00:00
Zeev Suraski df0906f7c0 Release fix 1999-05-13 16:48:49 +00:00
Zeev Suraski 5eaed486e1 * HTTP-auth bugfix
* Patch the regex thread safe code to compile in thread safe mode
1999-05-13 15:54:49 +00:00
Zeev Suraski 0b873a7899 *** empty log message *** 1999-05-12 23:05:17 +00:00
Zeev Suraski 52ac2e67c1 Enable Apache HTTP Auth 1999-05-12 22:49:23 +00:00
Zeev Suraski 49b01a4b3d Support HTTP Auth under ISAPI. Now, these short pieces of code took *A LOT* of
research :(
1999-05-12 21:35:16 +00:00
Stig S. Bakken cefca57c9c install libzend.a and header files on "make install" 1999-05-12 20:12:15 +00:00
Stig S. Bakken 97ea66a045 add --enable-thread-safety option 1999-05-12 20:11:42 +00:00
Zeev Suraski 853d6c6206 Added prepend to llist 1999-05-12 18:06:14 +00:00
Andrey Hristov 89a56a139b It's been there long enough. 1999-05-12 17:29:51 +00:00
Thies C. Arntzen 6c2c3a9587 compiles 1999-05-12 16:12:22 +00:00
Thies C. Arntzen d470b4cfe0 added _php3_hash_next_index_pointer_insert 1999-05-12 16:11:35 +00:00
Sascha Schumann a4d20864a6 - regex cache (needs some work)
- str_replace changes from php3
1999-05-12 15:40:15 +00:00
Thies C. Arntzen 3031862b24 up-to-date with 3.0.8 1999-05-12 14:28:01 +00:00
Thies C. Arntzen dc8d4f89c7 move oci8 from oracle to it's own ext-directory - configure stuff needs more work - but it configures and compiles 1999-05-12 14:21:38 +00:00
Thies C. Arntzen f04567b09e builds and configures again 1999-05-12 13:44:09 +00:00
Rasmus Lerdorf fbeeb8f29c substr() fix 1999-05-12 12:53:45 +00:00
Rasmus Lerdorf 43d93b6533 substr() fix for PHP4 as well 1999-05-12 12:43:03 +00:00
Zeev Suraski 6bc6dacf5c Fixes:
* Avoid closing stdin (I could have sworn I've committed that already)
* unclean_shutdown patches
1999-05-11 21:39:48 +00:00
Zeev Suraski e22cce0dda Easier Win32 debug code 1999-05-11 21:38:39 +00:00
Zeev Suraski 0997fcdc2b Fix 1999-05-11 21:27:44 +00:00
Zeev Suraski ceeb9b38ba * Finally commit that -q patch
* Refine SAPI built in header support
* Use DllMain() in ISAPI to clean after threads and initialize tsrm/sapi as soon as possible.
1999-05-11 20:38:16 +00:00
Andrey Hristov 702829709c Added compact() function. 1999-05-11 19:31:37 +00:00
Zeev Suraski 9fd708a313 Handle the Location: header centrally for all SAPI modules. 1999-05-11 18:36:35 +00:00
Zeev Suraski 473d1d7cf1 * Fix a bug that occured in case of parse errors. We need to restore the lexical state
even if the compilation failed.
1999-05-11 17:50:37 +00:00
Zeev Suraski ba88c0c47c * Move unclean_shutdown from PHP to Zend.
* The Master/Local headers in the phpinfo() table were reversed.
* Fix a gpc bug
1999-05-11 16:52:58 +00:00
Zeev Suraski 24dff20afa Support POST in Apache 1999-05-11 12:52:17 +00:00
Zeev Suraski dc5ed5a3fb beatify Apache's info func 1999-05-11 00:43:46 +00:00
Zeev Suraski 3e98dc5edc Memory leak fix 1999-05-11 00:09:22 +00:00
Zeev Suraski 0b77132507 * Get Apache to work. POST doesn't work yet.
* There are now -I directives for the absolute path of php4, php4/libzend and the builddir for
  the Apache module, so we can #include any php/Zend header.
* Rename config.h to php_config.h
1999-05-11 00:01:47 +00:00
Andrey Hristov 957616cd2d Minor updates. 1999-05-10 21:14:43 +00:00
Andrey Hristov d7ed9c1455 Added in_array() function. 1999-05-10 21:10:48 +00:00
Zeev Suraski 74a9ed7b3f Weed out all BoundsChecker-found bugs (including a serious file descriptor leak
in the C++ scanner)
1999-05-10 20:46:42 +00:00
Andrey Hristov ea0f19850e A couple of fixes. 1999-05-10 20:41:42 +00:00
Zeev Suraski 928e322038 Weed out all BoundsChecker-found bugs 1999-05-10 19:48:23 +00:00
Zeev Suraski 8f48b83df4 Only read POST info if the request method is POST. 1999-05-09 20:58:26 +00:00
Andi Gutmans 4079f914bd * Make read_post() read input by chunks instead of returning a single string.
This will allow us to efficiently support file upload through SAPI in the future.
* Fixes
1999-05-09 18:40:59 +00:00
Zeev Suraski 14a8e9b6c3 Change argument name 1999-05-09 14:56:38 +00:00
Zeev Suraski 60fcac8f2a A few other minor fixes 1999-05-09 13:57:09 +00:00
Zeev Suraski 5ba4b3311d Several minor fixes 1999-05-09 13:55:15 +00:00
Zeev Suraski bfbe86187e Almost forgot to commit those 1999-05-09 12:24:21 +00:00
Zeev Suraski bc415d5a88 * Finalizing the PHP version of SAPI. Support POST and cookies among other things.
* Fully implement ISAPI support - POST and cookies among other things.
* Almost completely rewrote phpinfo().  Allow modules to easily display their
  information in phpinfo() without modifying phpinfo() itself (prototype for
  the module info function was changed, thus the large amount of updated module
  files).
* Initial extended SAPI support for Apache, completely untested.
* CGI now uses SAPI fully as well.
1999-05-09 08:48:05 +00:00
Sascha Schumann 91cf2e59c4 get rid of the binary character, execute sed only once 1999-05-08 22:00:02 +00:00
Sascha Schumann 17a36c37d1 this is faster than parsing the file line by line 1999-05-08 21:44:12 +00:00
Andrey Hristov a0b94fccbb -Added extract() function
-Added function_exists() function
1999-05-08 21:18:06 +00:00
Andrey Hristov cd901e8586 -fixed configure.in.in to use genif.sh instead of genif.pl
-fixed genif.sh
-updated php3_mysql.h to have phpext_mysql_ptr
1999-05-08 18:16:30 +00:00
Zeev Suraski ae6f852cb6 Oh yeah, wrong license 1999-05-06 22:31:46 +00:00
Zeev Suraski ade1117ebd * Get output buffering to work again
* Warn about adding header information after headers are sent
* Several fixes
1999-05-06 21:58:49 +00:00
Sascha Schumann 324593224d calloc et al need stdlib.h according to ANSI-C 1999-05-06 21:13:26 +00:00
Sascha Schumann 2c42111694 add compat #define 1999-05-06 20:54:56 +00:00
Sascha Schumann a793fea1f7 Do we really want to depend on Perl? Shell scripts are handy and run on
virtually every Unix box whereas Perl does not. I don't think Perl should
be required when actually configuring PHP4. Open to comments...
1999-05-06 20:52:19 +00:00
Zeev Suraski c5d8c389a5 Ok, I tested it now. It works very nicely! 1999-05-06 19:13:13 +00:00
Zeev Suraski 465c94ce18 * Optimize _php3_parse_gpc_data() and clean it up, plus fix a couple of Zend related memory leaks in it 1999-05-06 18:09:50 +00:00
Zeev Suraski 842b5ee941 vpath fix
Apache compatability fix
1999-05-05 21:47:04 +00:00
Zeev Suraski 6f1c611868 Fixes 1999-05-05 21:29:26 +00:00
Zeev Suraski 54fa0e5d16 fix 1999-05-05 21:11:27 +00:00
Zeev Suraski aee864e9d8 Get CGI to work with the new headers code.
Now Apache is the only interface that doesn't use it.
1999-05-05 21:05:44 +00:00
Zeev Suraski 2740382c2c ISAPI WORKS! 1999-05-05 19:53:15 +00:00
Andi Gutmans c8b2bf0a1d llist improvements 1999-05-05 19:24:46 +00:00
Andi Gutmans 537cc54acd Added initial headers support in SAPI
*untested*
It definitely broke the thread-safe CGI, it may have broken other stuff as well.
1999-05-05 18:25:20 +00:00
Zeev Suraski 9e67cded5e Get Win32 to compile again 1999-05-04 20:27:30 +00:00
Zeev Suraski 95af652d2b An initial default builtin modules file for Win32 1999-05-04 03:43:49 +00:00
Zeev Suraski 18742324b3 ZTS fixes
Stig - --enable-thread-safety belongs in libzend, since libzend doesn't #include config.h, whereas
PHP does #include zend_config.h
1999-05-04 03:42:19 +00:00
Zeev Suraski 1401cd52fc vpath patches (cool job Stig!) 1999-05-03 19:59:55 +00:00
Stig Bakken 9a66ffbaee * added --enable-thread-safety switch
* now generating internal_functions.c
1999-05-03 11:11:23 +00:00
Zeev Suraski 9a4031ad64 Get apache uptodate 1999-05-02 20:04:18 +00:00
Zeev Suraski a5ab6b9638 Move path_info to the SAPI structure 1999-05-02 19:54:02 +00:00
Zeev Suraski 7071131f81 Get rid of request_info.path_translated 1999-05-02 19:31:56 +00:00
Zeev Suraski bc004fb062 Apache compile fix 1999-05-02 19:16:21 +00:00
Andi Gutmans fcaf734f94 - Don't support interactive mode when thread safe. 1999-05-02 19:07:46 +00:00
Zeev Suraski e6257bc388 UNIX CGI build fix 1999-05-02 19:01:45 +00:00
Andi Gutmans 5dbe924660 - Make ISAPI hook in as an extension too.
- Some work on moving stuff to SAPI.
1999-05-02 18:07:41 +00:00
Sascha Schumann 7e0ee50ed4 func name changes, remove arbitrary limit 1999-05-01 14:41:46 +00:00
Sascha Schumann 8baa86ed51 mcrypt 2.1.18 support, better autoconf checking 1999-05-01 11:14:22 +00:00
Zeev Suraski 064f75fd1b Several operator fixes. Should fix the MySQL problem. 1999-05-01 01:04:13 +00:00
Andi Gutmans 5dd7f27f0b - Free refcount when destroying the last class reference. 1999-04-30 23:32:03 +00:00
Andi Gutmans 202135bfac - Missed one place 1999-04-30 21:44:27 +00:00
Andi Gutmans 0e1f8ed58e - First try at fixing $a->foo[] syntax. 1999-04-30 20:27:36 +00:00
Thies C. Arntzen 75bc4593ff forward port of current oracle.c + fixes to make it actually work;-)!!! 1999-04-30 18:59:15 +00:00
Thies C. Arntzen 23917484ad oracle links again (at least on linux!!!) 1999-04-30 18:02:09 +00:00
Andi Gutmans 91371c4340 - Move back to yyless(). I haven't tested it yet because it's taking too long
to compile and I have to disconnect
1999-04-30 17:35:38 +00:00
Zeev Suraski 9dd66bc2ae Fix Boris's problem (in my never ending struggle to show I never mean what I say
when I say something's not gonna happen :)
1999-04-30 17:29:18 +00:00
Zeev Suraski bc3686c14a * Fix a problem with constant quoted strings, that was causing Thies's problem
* Remove a development-time printf
1999-04-30 10:46:48 +00:00
Andi Gutmans 95e2e023fb - No reason to handle newlines here. 1999-04-29 20:58:29 +00:00
Zeev Suraski d90ea1a136 Make the C++ scanner support interactive input 1999-04-28 23:18:57 +00:00
Zeev Suraski e22a1a08a5 Get the MySQL module to use the new INI mechanism feature 1999-04-28 21:37:54 +00:00
Zeev Suraski d843632629 Remove redundant code 1999-04-28 21:29:31 +00:00
Zeev Suraski a877f6d380 Additional generalization of the INI mechanism. Avoid needing specialized
message handlers in 99% of the cases.
1999-04-28 21:14:47 +00:00
Zeev Suraski 66476011dd A step towards generalizing the INI mechanism even more 1999-04-28 20:26:33 +00:00
Zeev Suraski 1aaf98e54b get rid of some stupid warnings 1999-04-28 20:18:25 +00:00
Andi Gutmans cef5243b64 - export patch 1999-04-28 18:35:42 +00:00
Andi Gutmans a74b342612 - Small startup fix. 1999-04-28 17:38:24 +00:00
Andi Gutmans 8423f8f1d3 dsp update 1999-04-28 16:13:09 +00:00
Rasmus Lerdorf 92905543f1 Add fgetcsv() here as well 1999-04-27 13:06:58 +00:00
Zeev Suraski 2493f68018 * Fix debugger+interactive mode bug
* Recognize whether an extension is with debug information or not
1999-04-27 11:00:59 +00:00
Zeev Suraski 1245356128 * Get rid of the memory leak messages in case of fatal errors or exit()
* .dsp fixes
* Minor fixes
1999-04-27 10:00:54 +00:00
Zeev Suraski 9b56453566 * Small startup fix
* Fix min() and max()
1999-04-26 20:20:12 +00:00
Zeev Suraski 7375ca5588 Temporary fix for CGI compilation under UNIX 1999-04-26 19:48:10 +00:00
Zeev Suraski 48de4ce0dd Somehow the rules for the configuration parser/scanners disappeared 1999-04-26 19:02:59 +00:00
Andrey Hristov b9d3a80709 Fixing a few thing to make AC_CHECK_CC_OPTION work. 1999-04-26 18:06:04 +00:00
Zeev Suraski 3cd0af11ee * Get the Apache module to compile again
* Get rid of php3_rqst, use SG(server_context) instead (there's still Apache-specific code,
  but it nuked a global)
1999-04-26 17:26:37 +00:00
Zeev Suraski 0f195a79cd fix 1999-04-26 15:16:06 +00:00
Zeev Suraski c55a67657f Match the CVS name 1999-04-26 14:11:20 +00:00
Zeev Suraski 7c4a08381e Various thread safety fixes and DLL updates 1999-04-26 14:10:42 +00:00
Zeev Suraski 7942eaf381 * Plenty of thread safety and Win32 work.
* Changed PHP4 to compile as a DLL, both ISAPI and the the CGI run with the same DLL.
* Switched to using the DLL runtime library under Win32.  PHP will NOT work if
  compiled against the static library!
* Removed yesterday's php4libts project (with php4dllts, it's obsolete).

This *does* affect thread-unsafe Windows as well - the thread unsafe CGI is also
dependant on the thread-unsafe DLL.
1999-04-26 14:00:49 +00:00
Andi Gutmans 050cb7cfe3 -Add .dsp file 1999-04-26 03:04:29 +00:00
Andi Gutmans df6134bc42 -More commits 1999-04-26 03:03:39 +00:00
Andi Gutmans 9c51acdc17 -More 1999-04-26 03:03:36 +00:00
Rasmus Lerdorf 5c09d8e616 Make GD config fail if it doesn't find the gd files 1999-04-25 23:29:52 +00:00
Sascha Schumann 1e54412bdc PHP3 compat stuff 1999-04-25 22:22:13 +00:00
Rasmus Lerdorf 8ffbed7d7e Ok, apxs build works nicely now 1999-04-25 22:16:44 +00:00
Sascha Schumann c62ffa7e01 oops, the 0th byte should be set, too 1999-04-25 21:50:24 +00:00
Sascha Schumann 77baa4ebb4 final change (?), add get_algorithms_name 1999-04-25 21:49:01 +00:00
Sascha Schumann 12a76342ed make code more compact 1999-04-25 21:32:52 +00:00
Sascha Schumann 5ed41f31af remove some redundant code 1999-04-25 21:24:07 +00:00
Sascha Schumann 5883d6c221 that was a silly one 1999-04-25 21:13:21 +00:00
Sascha Schumann 22d720e00c add OFB mode, the final one 1999-04-25 21:11:29 +00:00
Sascha Schumann a1a41504c7 add mcrypt_create_iv() 1999-04-25 21:09:07 +00:00
Zeev Suraski 23a1d3fb91 Win32 isn't a good os to commit uppercase files with... 1999-04-25 21:04:17 +00:00
Sascha Schumann 6b890309ef cleanup, add new stream mode, allow IV for CBC mode 1999-04-25 20:44:52 +00:00
Sascha Schumann 7d1ee82d79 add get_(key|block)_size 1999-04-25 20:32:15 +00:00
Andi Gutmans 10710c046d Ah, these too 1999-04-25 19:36:57 +00:00
Andi Gutmans 4ebb4060f9 * Fix a couple of thread safety issues
* Add initial ISAPI support.  Very very experimental.
* In the thread safe version, generate php4 as a library so that we can link it with both
php.exe and the ISAPI dll.  We should probably consider doing that under all circumstances,
under UNIX as well.

The thread-unsafe version *should* be unharmed.
1999-04-25 19:35:44 +00:00
Sascha Schumann 1db171deb8 add CBC 1999-04-25 17:04:56 +00:00
Sascha Schumann 11fc109ca6 add mcrypt module 1999-04-25 16:50:40 +00:00
Rasmus Lerdorf c4442ed7c5 Ok, this beast compiles via --with-apxs
Not sure if it actually works yet though.  I have a feeling there are
some -fpic flags missing in the libzend build.  Will test later on
today.
1999-04-25 14:10:23 +00:00
Sascha Schumann ac9c0d03e0 -f tests for plain files only. We need a way to find out whether we could do any damage to existing files. If we cannot write to them, we probably cannot do harmful things hopefully. 1999-04-25 14:08:41 +00:00
Thies C. Arntzen 9cace18e10 serialize & unserialize working (with mem-leak) 1999-04-25 12:41:18 +00:00
Rasmus Lerdorf 0704064cdf Argh! That typo took me over an hour to find. Grr.. 1999-04-25 04:03:36 +00:00
Andrey Hristov ef7a4db341 test -e fails in sh. Used test -f instead. 1999-04-25 00:55:01 +00:00
Sascha Schumann 6955cacb21 unreliable check whether cc option can be used really 1999-04-24 23:36:25 +00:00
Zeev Suraski 5974d84bc6 Fixes 1999-04-24 23:22:09 +00:00
Sascha Schumann a156a47187 security check and disclaimer for generated files 1999-04-24 22:16:06 +00:00
Rasmus Lerdorf 2d78e4779e Oops, would be a good idea to edit the .in file instead of acconfig.h 1999-04-24 21:55:44 +00:00
Rasmus Lerdorf ecc1dce8f5 libbind check 1999-04-24 21:52:53 +00:00
Sascha Schumann d558f56ba0 add function checks 1999-04-24 21:39:33 +00:00
Andrey Hristov 4aeb630539 Change cmp'risons to be cross-shell compatible. 1999-04-24 21:21:35 +00:00
Sascha Schumann 3b195581db bugfix port 1999-04-24 20:48:12 +00:00
Sascha Schumann bec518a62d port from PHP3 1999-04-24 20:43:58 +00:00
Sascha Schumann 8036c5fbf1 include some header files explicitly 1999-04-24 20:26:31 +00:00
Zeev Suraski c09e7de63a Use relative paths 1999-04-24 19:10:02 +00:00
Thies C. Arntzen d0d3316128 forward-port of php3-CVS version
my 1st zend-array stuff (ocifetchinto) is WORKING!!
1999-04-24 18:54:02 +00:00
Thies C. Arntzen 992e6a429d made var_dump zend-aware....
<?
$ar = array("hallo" => "tubu");

var_dump($ar);
?>
works again!!!

zeev, andi -> please review what i've done!!!

(no i can start "debugging" other stuff, as i often use var_dump)
1999-04-24 18:39:41 +00:00
Zeev Suraski 208e81696f Another small fix 1999-04-24 17:16:39 +00:00
Zeev Suraski 1ab3e00bc0 Add my API letters to the CVS 1999-04-24 16:57:46 +00:00
Zeev Suraski f6971f17a9 dsp update 1999-04-24 16:52:40 +00:00
Zeev Suraski 125275b084 Small fixes 1999-04-24 16:51:15 +00:00
Zeev Suraski 6ecc81c097 We'd have to find a different way of allowing timeouts in Win32 1999-04-24 16:17:04 +00:00
Zeev Suraski e06a1ed265 Thread safety fixes 1999-04-24 16:16:11 +00:00
Stig S. Bakken 3b516557f2 set up automake 1999-04-24 16:14:18 +00:00
Zeev Suraski 8dd4a63366 Remove redundant includes 1999-04-24 09:26:09 +00:00
Zeev Suraski cd07879f2d g++ compile fix 1999-04-24 09:08:03 +00:00
Zeev Suraski 1e9ce9528d *** empty log message *** 1999-04-24 09:01:30 +00:00
Zeev Suraski 5a5806e02a Cleanups, remove old ts code 1999-04-24 00:12:55 +00:00
Zeev Suraski 0818d96c97 A lot of cleanups... Removed old thread-safe code and other redundant code and files 1999-04-24 00:12:00 +00:00
Zeev Suraski 05d24c6022 Remove redundant code 1999-04-23 22:45:01 +00:00
Zeev Suraski 09946676d2 Thread-safe header_is_being_sent 1999-04-23 20:20:30 +00:00
Zeev Suraski 6f7c0edee3 Remove tls.[ch] 1999-04-23 20:06:01 +00:00
Zeev Suraski f53afa6edd cleanups 1999-04-23 19:50:29 +00:00
Zeev Suraski b2c5ef42d3 Arithmetics bug fix 1999-04-23 13:25:33 +00:00
Zeev Suraski bce60f0fe6 * MySQL fix (thanks Stig)
* Remove reundant includes from bcmath
1999-04-23 12:38:45 +00:00
Stig Bakken 94cde33459 use only EXTRA_LIBS 1999-04-23 12:11:37 +00:00
Zeev Suraski 43c9b540d7 Minor MySQL thread safety issues 1999-04-23 11:12:41 +00:00
Zeev Suraski 5be8dd9712 License 1999-04-23 11:00:02 +00:00
Zeev Suraski f9cdc88471 Testing unified diffs 1999-04-23 10:26:49 +00:00
Zeev Suraski a458b4f6bd Support eval() and highlight_string() in the C++ scanner 1999-04-23 10:21:00 +00:00
Andi Gutmans 01575b9d9d - Use yyless() instead of unput() where possible. I'll erase the commented
out code in a day or so.
1999-04-23 06:14:06 +00:00
Rasmus Lerdorf 7440bc50da Ok, finally.. These now work nicely on a RH-5.2 box:
--with-mysql --with-ldap --with-imap --with-zlib --with-snmp
1999-04-23 04:54:31 +00:00
Rasmus Lerdorf 806dfc2a76 Make zlib compile 1999-04-23 04:12:13 +00:00
Zeev Suraski 8a2f6371fe *** empty log message *** 1999-04-23 03:36:17 +00:00
Zeev Suraski 1aa2c5c0b4 Ok, call me crazy, because I probably am.
Thread safe version now uses a C++ scanner object.  Works fully.
1999-04-23 03:32:33 +00:00
Rasmus Lerdorf cad2318a54 Module work 1999-04-23 03:28:47 +00:00
Zeev Suraski 551fe7780b Make token names uniform, they all begin with T_ now. 1999-04-22 23:08:42 +00:00
Zeev Suraski 327fc20243 vpath fix 1999-04-22 22:28:17 +00:00
Rasmus Lerdorf af3f73f7a3 This is generated 1999-04-22 04:42:58 +00:00
Rasmus Lerdorf 77cdb5f483 Bring imap build rules up to date. We still have a problem here though.
In this new build structure we are adding libraries to $LIBS as we add
modules instead of doing an AC_SUBST into the Makefile.  One reason for
doing the subst in php3 was to get around the libraries that could not
be included in $LIBS because doing so would mess up the various configure
tests.  For example, you can't do a -limap as part of the various simple
configure compile programs because -limap requires a bunch of callback
symbols to be present.
1999-04-22 04:21:08 +00:00
Andi Gutmans 916692f4ad - Update the regular VC project file. 1999-04-22 03:58:37 +00:00
Stig Bakken e109756121 db was not linked in 1999-04-22 03:03:35 +00:00
Stig Bakken 09d047f8b1 db was not linked in 1999-04-22 03:01:32 +00:00
Stig Bakken 2c0ad3ee25 last bunch of extensions moving to ext/
fhttpd module taken out of functions, functions is ready to go.
The only extensions I have tested are gd+freetype and odbc(solid).
Please try compiling in your favourite extensions and let me know how it
works.
1999-04-22 02:48:28 +00:00
Stig Bakken 2a78f92804 moved imap and ldap 1999-04-22 00:45:14 +00:00
Stig Bakken ff37732997 moved fdf, hyperwave, informix and some smaller files 1999-04-22 00:25:57 +00:00
Stig Bakken f582bec9db moved db 1999-04-21 23:37:47 +00:00
Stig Bakken f9f82960d9 moved bcmath 1999-04-21 23:28:00 +00:00
Stig Bakken a297b95c9d moved apache, com and hyperwave into ext/ 1999-04-21 23:11:20 +00:00
Stig Bakken f67a9bdc52 moved dav, msql and oracle to ext/ 1999-04-21 22:49:16 +00:00
Stig Bakken 96660d9a8c moved filepro to ext 1999-04-21 22:11:15 +00:00
Stig Bakken 71c71a4732 moved filepro to ext 1999-04-21 22:05:45 +00:00
Stig Bakken 7d013383e9 mysql should work again now, can someone with mysql installed test it? 1999-04-21 21:34:57 +00:00
Stig Bakken 5d75ccdcff gd compile fix 1999-04-21 21:27:18 +00:00
Stig Bakken 3789ac7ea0 moving mysql to ext/ 1999-04-21 21:26:10 +00:00
Stig Bakken f9d169c812 create .cvsignore only once :-) 1999-04-21 21:13:40 +00:00
Stig Bakken 3a3e18728c create .cvsignore as well 1999-04-21 20:39:22 +00:00
Stig S. Bakken d9144155f5 state which aclocal.m4 and configure files are created 1999-04-21 20:33:33 +00:00
Stig Bakken 72c2d04d72 state which aclocal.m4 and configure files are created 1999-04-21 20:32:56 +00:00
Stig Bakken 8335a61d74 merge the object files in a temporary directory 1999-04-21 20:30:47 +00:00
Stig S. Bakken 1ee30e61fc zend-parser.o and zend-scanner.o were included twice in libzend.a 1999-04-21 20:30:37 +00:00
Zeev Suraski 942f409292 * Change the thread safe project to create a C++ scanner.
* Add in a slightly modified skeleton file (only a couple of #if's for #include's
that we dont have in Windows)

It does NOT compile or work yet :)
1999-04-21 20:13:02 +00:00
Zeev Suraski 1573412776 Thread safe project update 1999-04-21 19:40:16 +00:00
Stig Bakken 23280d0a75 added PHP_API_VERSION, simply set it to 19990421 for now 1999-04-21 19:39:21 +00:00
Zeev Suraski 937270f319 Fix 1999-04-21 19:10:54 +00:00
Zeev Suraski 7d34d425be Minor fixes 1999-04-21 19:10:18 +00:00
Zeev Suraski 751709a469 * Rename php_compat.[ch] to flock_compat.[ch] and move it to ext/standard
* Fix Win32 compilation
1999-04-21 19:01:38 +00:00
Sascha Schumann 065636be85 forgot that one 1999-04-21 18:10:39 +00:00
Sascha Schumann 08c6298af9 cleanup, flock() support 1999-04-21 18:10:18 +00:00
Sascha Schumann f06cb4deb6 crypt constants 1999-04-21 17:57:40 +00:00
Sascha Schumann 2873f446f2 cleanup 1999-04-21 17:48:11 +00:00
Zeev Suraski 7aad231327 Thread safety patch. It works now with just-in-time resource initialization! 1999-04-21 17:28:54 +00:00
Zeev Suraski a9f9ae7920 Thread safety patch. It works now with 'just in time' resource initialization! 1999-04-21 17:26:37 +00:00
Sascha Schumann 48e350a94d incorporate gettext support 1999-04-21 17:26:16 +00:00
Sascha Schumann dcc16af80c port some fixes, add compat routines 1999-04-21 17:11:01 +00:00
Sascha Schumann a6e4ef3e31 str_replace fix 1999-04-21 16:31:27 +00:00
Stig Bakken 9b3c1ca2c3 make config.h.stub as well 1999-04-21 16:23:47 +00:00
Stig Bakken 43ed903949 remove old libtool and automake stuff that was borrowed using 3.0 1999-04-21 15:52:42 +00:00
Zeev Suraski 52fcaa443b Thread-safe project 1999-04-21 15:35:57 +00:00
Zeev Suraski 763ed6a4fb Update thread-safe projects 1999-04-21 15:34:31 +00:00
Sascha Schumann 4908dbdf36 config.h.in is a generated file and should be ignored by CVS 1999-04-21 15:16:30 +00:00
Stig Bakken f8fe0ad29c move automake back to before autoconf 1999-04-21 14:07:07 +00:00
Stig S. Bakken a9d3d0832a move automake back to before autoconf 1999-04-21 14:06:58 +00:00
Stig Bakken 02f9dc6460 autoheader must be called after autoconf, automake after autoheader 1999-04-21 13:47:05 +00:00
Stig S. Bakken 9003b9a261 autoheader must be called after autoconf, automake after autoheader 1999-04-21 13:45:46 +00:00
Stig S. Bakken bb74a94fa5 think before one commits 1999-04-21 13:26:27 +00:00
Stig S. Bakken f68609b50f doh. cvs appears to ignore .in files by default 1999-04-21 13:24:39 +00:00
Sascha Schumann 8489ea5414 generates basic skeleton for new extension 1999-04-21 10:24:41 +00:00
Zeev Suraski c5af324ec3 More thread safety work 1999-04-21 04:02:11 +00:00
Zeev Suraski 7a87fcbbda Thread safety patch. We're still not quite there but it compiles again, and
more logic has been implemented.
1999-04-21 03:49:09 +00:00
Zeev Suraski 37fe04b887 Thread Safe Resource Manager 1999-04-20 23:58:02 +00:00
Stig Bakken b84ce5a06a added ext/*/config.h.stub files
removed config.h.in (generated)
1999-04-20 01:23:32 +00:00
Stig S. Bakken 9e4c7bd56c Makefile.in and aclocal.m4 are generated
added buildconf script
1999-04-20 01:12:53 +00:00
Stig Bakken 54468d2e75 odbc compiles and runs on UNIX again (tested with Solid 2.3) 1999-04-20 01:03:12 +00:00
Zeev Suraski b7c30c1bdf Return a success value from the startup function, so we can unload immediately
if it fails.
1999-04-19 21:39:18 +00:00
Stig Bakken 84e9ea1726 convert libzend to automake 1999-04-19 20:11:50 +00:00
Stig S. Bakken b227e385cc convert to automake 1999-04-19 20:10:26 +00:00
Andi Gutmans 5033ee7d69 Rearrange the .dsp for the new ODBC layout 1999-04-19 18:57:29 +00:00
Andi Gutmans 9deab4118d Add a couple of ZEND_API's 1999-04-19 18:57:14 +00:00
Stig Bakken a2d8219e2c ignore acconfig.h 1999-04-19 17:36:25 +00:00
Stig Bakken edf17b2a8f include the right header files 1999-04-19 17:24:25 +00:00
Stig Bakken 7d9c4da459 generate acconfig.h from acconfig.h.in and ext/*/config.h.stub 1999-04-19 17:19:37 +00:00
Andi Gutmans dd03a7a2f3 Support =unset as arguments 1999-04-19 16:28:05 +00:00
Stig Bakken 7dee737fb4 moved odbc into ext/ 1999-04-19 15:04:11 +00:00
Stig Bakken aac5a43123 keep old files if they are not modified 1999-04-19 13:58:54 +00:00
Stig Bakken 269877fdf3 moved dbase into ext/ 1999-04-19 13:58:31 +00:00
Stig Bakken 6094128afe moved dbase into ext/ along with the bundled library
dbase programs are no longer included
1999-04-19 13:56:50 +00:00
Stig S. Bakken b515f34dd1 removed -lnsl and -lsocket checks from zend 1999-04-19 13:51:13 +00:00
Stig Bakken 3912318923 run automake and run autoconf in libzend 1999-04-19 08:07:20 +00:00
Zeev Suraski 1390eadc14 Ah, so that file is generated too 1999-04-18 20:59:54 +00:00
Zeev Suraski 1ae9891e7e AiCount needs to be decreased here 1999-04-18 19:55:42 +00:00
Zeev Suraski cc5e008b72 * Added buildconf, runs all the scripts necessary to build configure (Stig - if there's any way
to detect whether we need to run 'automake --add-missing', please add it...)
* Make vpath work again
* Minor UNIX bugfixes
1999-04-18 18:06:54 +00:00
Zeev Suraski 5e8c322859 Make Win32 happy with the recent changes. 1999-04-18 15:58:27 +00:00
Zeev Suraski f432c05c3f Forgot to add these - Win32 registry support 1999-04-18 15:54:18 +00:00
Zeev Suraski 342c6e0b23 Whatnot:
* updated alloc_persist to use critical sections
* changed extension shutdown to two-phase
* updated dependencies
* PR support (don't remember if there was any really)
1999-04-18 15:11:52 +00:00
Zeev Suraski 2e8fb4e329 Win32 registry support 1999-04-18 15:09:46 +00:00
Andi Gutmans 593e603e4b - Make gettype() behave like it used to where it returned "object" for
objects.
1999-04-17 07:02:58 +00:00
Stig Bakken 1e2474b18c Apache module compiles again 1999-04-17 02:01:20 +00:00
Stig Bakken f4f53c850a this file is now generated 1999-04-17 01:54:27 +00:00
Stig Bakken 4f7b0a0ccd make sure the images on the phpinfo() page point to PHP-enabled pages 1999-04-17 01:52:58 +00:00
Stig Bakken af88aa5474 ignore configure.in 1999-04-17 00:43:47 +00:00
Stig Bakken 74fb12efd5 this file is now generated 1999-04-17 00:43:21 +00:00
Stig Bakken 257de2bade First commit of re-structuring phase one. We have started using automake in
sub-directories and started to move extension code into ext/<name>.  For now,
I have moved the "standard" extension (which is quite a mix of everything
right now) and the GD extension into their own subdirs in ext/.
The configure script now also runs configure in the libzend directory
automatically and makes sure php4 and libzend use the same config.cache file.
To avoid running configure in libzend, use the --no-recursion option.
"make" in php4 also builds libzend now.
The Apache module doesn't compile right now, but a fix for that is
coming up.
1999-04-17 00:37:12 +00:00
Stig Bakken 2127ede122 updated GD from php3 repository, using it as a test extension for the new
directory structure
1999-04-16 12:15:38 +00:00
Andi Gutmans 8cf2d74b76 - Make the memory leak message print PHP4. 1999-04-16 08:12:51 +00:00
Andi Gutmans b32b2831d8 - one more place which seems to have needed fixing. I don't have time to look
more into it. I hope we don't have anymore places which need fixing.
1999-04-15 17:43:16 +00:00
Andi Gutmans 3d631c4ca0 - Should fix the pass by reference problem. This happened because we moved
start from arg 1 now and not arg 0. There might be more places which need fixing
 like in the executor but the bug seems OK now.
1999-04-15 17:41:21 +00:00
Zeev Suraski fa76f0c903 Compile fix 1999-04-14 21:03:25 +00:00
Andi Gutmans 39f9487ee1 -Tiny patches 1999-04-14 19:53:33 +00:00
Zeev Suraski 76ceb9ad44 Better detection 1999-04-13 22:09:59 +00:00
Zeev Suraski 7c2155c1ad Move Ai stuff before get_zval_*(), like Andi suggested. Fixes Sascha's huge
memory leak
1999-04-13 20:50:31 +00:00
Andi Gutmans e1e2226b92 - Fix various memory leaks. 1999-04-13 19:28:03 +00:00
Andi Gutmans d86ed8207c Refcount bugfix 1999-04-13 17:49:14 +00:00
Andi Gutmans 3fcc6511f6 * Optimize argument_stack top lookup
* Fix a nasty bug in zend_ptr_stack_clean()
1999-04-13 17:03:10 +00:00
Zeev Suraski 533f135987 Remove unnecessary stack 1999-04-12 21:50:49 +00:00
Zeev Suraski ad9b13eb9e off by one 1999-04-12 21:06:29 +00:00
Zeev Suraski 1dff49ec83 Minor optimization 1999-04-12 20:49:02 +00:00
Zeev Suraski 3ca6d6113a Make functions that don't take arguments somewhat happier:) 1999-04-12 19:44:47 +00:00
Zeev Suraski 714f450a00 This should take care of "this" for user-defined functions. It wasn't yet working
for built-in functions anyway, this one is coming soon.
1999-04-12 19:40:48 +00:00
Zeev Suraski 0666083907 NULL's should remain NULLs (at least in strings) 1999-04-12 19:40:33 +00:00
Zeev Suraski 15be5f0b4a Destroy the resource list after destroying the symbol table, otherwise the
auto-destructor for resources are run when the resource list is no longer valid
1999-04-12 18:40:18 +00:00
Zeev Suraski 39a7f4c306 This patch is a go. Not fully optimized yet, but working properly.
Prepatch tagged as BEFORE_STACK_PATCH.
1999-04-12 18:29:09 +00:00
Zeev Suraski b06c5731fc Minor fixes:
missing zval_copy_ctor()
	messed up AiCount fix
1999-04-12 17:59:36 +00:00
Stig Bakken 4213b5d6b6 tolerate uninitialized ini settings in php_ini_{long,double,string}() 1999-04-12 16:35:25 +00:00
Sascha Schumann 483caf3669 This should help in keeping PHP4 up to date 1999-04-12 04:05:50 +00:00
Zeev Suraski 4869bd3bfc Test patch... 1999-04-10 21:39:23 +00:00
Zeev Suraski 3b53a8ad0f test patch 1999-04-10 21:34:53 +00:00
Zeev Suraski 1c23f75627 Oops 1999-04-10 21:30:49 +00:00
Zeev Suraski 4b98f345d1 php3_ini? What's that? 1999-04-10 17:39:08 +00:00
Zeev Suraski bb6dff9c67 Buh-bye php3_ini 1999-04-10 16:25:23 +00:00
Zeev Suraski 4472d05025 Allow runtime setting of the memory limit 1999-04-10 16:24:28 +00:00
Zeev Suraski 2e9886de3c Get rid of php3_ini in Zend 1999-04-10 14:44:35 +00:00
Zeev Suraski e3d2234b80 A lot of php3_ini -> php_ini work 1999-04-10 13:32:47 +00:00
Zeev Suraski 79f9f0ce88 Move safe_mode to the new php_ini mechanism 1999-04-10 12:17:20 +00:00
Zeev Suraski 7685b44c4b Move asp_tags and short_open_tag to the new php_ini mechanism 1999-04-10 11:22:18 +00:00
Zeev Suraski 7656c77c38 We need to initialize the utility values after we initialize the INI file, which in
turn, is after we initialize Zend.  Set the utility values separately from Zend's
initialization
1999-04-10 11:21:55 +00:00
Zeev Suraski 4fd1d5b81b * php_ini fixes
* convert the MySQL module to use the new php_ini mechanism
1999-04-10 00:19:33 +00:00
Zeev Suraski d40e88a016 Apache php_ini support 1999-04-09 21:15:07 +00:00
Zeev Suraski e95ebe0453 testing 123 1999-04-09 21:10:11 +00:00
Zeev Suraski f92db069c3 test, ignore 1999-04-09 21:08:34 +00:00
Zeev Suraski 651e232f04 Testing 123 1999-04-09 21:04:12 +00:00
Andi Gutmans 906dc43ed7 - Changed here-docs to <<< followed by whitespace. 1999-04-09 20:47:29 +00:00
Zeev Suraski f8ef66d1a4 *** empty log message *** 1999-04-09 20:12:46 +00:00
Zeev Suraski b6f5873260 Get the apache module to compile 1999-04-09 19:51:47 +00:00
Zeev Suraski 011813cce8 *** empty log message *** 1999-04-09 19:16:46 +00:00
Stig S. Bakken 763061bbea ignore file 1999-04-09 19:11:00 +00:00
Zeev Suraski 3e58450513 * A lot of work on php_ini stuff
* A lot of work on getting rid from php3_ini
1999-04-09 19:09:29 +00:00
Andi Gutmans 5cb576d81a - I guess print $GLOBALS and print "$GLOBALS" should yield the same result
so I returned the one in encaps_var.
- Made INITAL_OP_ARRAY_SIZE smaller (64? can't remeber). I don't think the
  erealloc()'s during compile time are such a biggy, we might make it even
  smaller. We can have a configure time option as to it's size.
1999-04-09 15:18:29 +00:00
Andi Gutmans 2d7b9b038d - Support $GLOBALS in cvar's. Now list(..) = each($GLOBALS) will work.
- Remove support of $GLOBALS in enacapsed strings. print "$GLOBALS" isn't
  supposed to work in any case.
1999-04-09 15:01:13 +00:00
Zeev Suraski 43c0e94ac9 Honor a semicolon on the same line as an ending token of a heredoc 1999-04-09 11:19:03 +00:00
Zeev Suraski 0a6e9ddd7f Prevent class redeclarations 1999-04-09 10:59:58 +00:00
Zeev Suraski 3edb99e8ac Type library support in COM module 1999-04-08 23:14:56 +00:00
Zeev Suraski 6a97e1662d * Add arguments to shutdown function
* Bring php_ini uptodate
1999-04-08 21:32:57 +00:00
Zeev Suraski 9d8e0db38f * Add arguments to shutdown functions
* Remove traces of php_ini stuff
1999-04-08 21:14:50 +00:00
Zeev Suraski f2d5ca7482 "Our favourite mistake" 1999-04-08 20:27:08 +00:00
Zeev Suraski 17bdb70823 $GLOBALS support 1999-04-08 20:21:36 +00:00
Zeev Suraski 9d1a9331b3 Fix for php -v 1999-04-08 14:55:42 +00:00
Stig Bakken a12d0a1c1c patched in fsock.c from php3 1999-04-08 08:57:09 +00:00
Kristian Köhntopp 22335a4ec7 Spurious $ removed in Makefile.in 1999-04-08 08:23:37 +00:00
Andi Gutmans 893160fcbe foreach() syntax has changed 1999-04-08 04:11:23 +00:00
Zeev Suraski 135da4b4fc Fix static assignment 1999-04-08 00:18:29 +00:00
Stig Bakken d0738c2bc3 get rid of extra and doc dirs, more cvs ignore stuff 1999-04-08 00:04:44 +00:00
Stig Bakken 9bc17ac6b2 fix configure warnings 1999-04-07 23:59:51 +00:00
Zeev Suraski d1d96d04c6 Remove an unused variable 1999-04-07 23:09:09 +00:00
Zeev Suraski 18402e05b9 Update deps 1999-04-07 21:20:42 +00:00
Zeev Suraski 882bbf6f45 Win32 patches 1999-04-07 21:19:35 +00:00
Zeev Suraski 694d94983b That's better. 1999-04-07 21:14:10 +00:00
541 changed files with 117000 additions and 13892 deletions

No files matched your search

View File
File renamed without changes.
+2 -175
View File
@@ -1,176 +1,3 @@
PHP Version 3.0 Development Team
For the list of people who've put work into PHP 4.0, please see
http://www.php.net/version4/credits.php
------------------------------------------------------------------------------
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.
+3 -2
View File
@@ -1,5 +1,6 @@
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)
@@ -223,7 +224,7 @@ July 18 1998 Version 3.0.2
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 -L path in libphp4.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
@@ -416,7 +417,7 @@ March 30 1998 Version 3.0 Release Candidate 2
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
- *WARNING* Move Apache 1.3 php3 file install to src/modules/php4 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
+87
View File
@@ -0,0 +1,87 @@
This is the ChangeLog from PHP3 as of Apr 12 1999.
Entries should be removed from this file, if you transfer changes
over to PHP4.
============================================================================
?? 1999, Version 3.0.8
- added Oracle-OCI8 persistent connections
- fixed OCIDefineByName crash.
- fixed some NULL-column related problems in OCI8-module.
- Some Informix driver improvements.
- PUT method support (mlemos@acm.org)
- Fix parameter count problem in odbc_setoption()
- Really fix implode() this time. The fix in 3.0.7 was bogus
- Added more option to the date() function: (Colin Viebrock)
'g' - hour, 12-hour format, no leading zeros
'G' - hour, 24-hour format, no leading zeros
'n' - month, numeric, no leading zeros
- Make fgetss() slightly smarter
- Add strip_tags() which uses the fgetss state-machine but acts on a string
March 1 1999, Version 3.0.7
- Added pdf_put_image and pdf_execute_image
- Initial work on an ImageMagick module - doesn't do anything yet
- Make configure script detect Netscape's LDAP SDK automagically
- Fixed Oracle-OCI8 module for windows.
- Add OCIRowCount function. (Number of affected rows for update-statements)
- Add OCIDefineByName function.
- Change the behaviour of open_basedir. It's now possible to supply more
than one directory. open_basedir paths from parent directories are now
automatically inherited.
- fix rand() and mt_rand() to make the ranges work correctly
- htmlspecialchars() and htmlentities() are now binary safe.
- Add extract() function.
- Oracle-OCI8 driver now supports BLOBS/CLOBS and IN/OUT binding of local php
variables.
- Clean up apxs build
- Add INSTALL.REDHAT file to walk RedHat users through the install
- Added optional second argument to mysql_fetch_array(); MYSQL_ASSOC will
cause the resulting array to contain the associative indices only,
MYSQL_NUM will cause the array to contain the numeric indices only (like
mysql_fetch_row()) and MYSQL_BOTH would cause them both to be defined
(default).
- Backport the Zend debugging memory manager into the PHP 3.0.x tree.
- Add function_exists() function.
- Add another version of WDDX module
(we need to pick a single implementation here)
- Fixed includes for iODBC to support both the old and the new LGPL version
- Fix implode() bug - When imploding an array that contained unset() elements
it wasn't correctly skipping past these
- Add connection_status() function. This returns the raw bitfield which
indicates whether the script terminated due to a user abort, a timeout
or normally. Note that if ignore_user_abort is enabled, then both the
timeout state and the user abort state can be active
- Add connection_timeout() function. This one can be called in a shutdown
function to tell you if you got there because of a timeout
- Add ignore_user_abort() function and .ini/.conf directive of same name
- Fix connection abort detection code - It should now work reliably with
Apache. Also added a user-level connection_aborted() function designed to
let people check whether the user aborted the connection in a user-level
shutdown function.
- Add pfsockopen() function
- Improvements in FreeType support: Macintosh fonts work, and non-antialiased
output is considerably cleaner <mka@satama.com>
- Fixed checkdate() function, range of valid years is now 0 to 32767
- hw_insertdocument() returns object id now
- Add pdf_open() warning in configure and documentation
- Add diskfreespace() function
- Added aspell support
- Iptcparse would sometimes find a wrong tag.
- Force var_dump() to output headers
- Add optional 3th parameter to ora_fetchinto.
- Serialize and var_dump no longer show array elements that
have been unset.
- Add IptcEmbed() function (can replace an APP13-Marker in a JPEG file)
- Add OCI8 module for Windows
- Fix bug in pdf_close() function
- Add WDDX support (see http://www.wddx.org for more info)
- Add similar_text() function
- Constructors of parent classes weren't accessible to derived classes (as
of 3.0.6). Fixed.
- Introduce simple regex compilation cache
+29 -29
View File
@@ -1,7 +1,7 @@
Installation Instructions for PHP3
----------------------------------
Installation Instructions for PHP 4.0
-------------------------------------
For the impatient here is a quick set of steps that will build PHP3
For the impatient here is a quick set of steps that will build PHP
as an Apache module for Apache 1.3.0 with MySQL support. A more verbose
explanation follows.
@@ -10,41 +10,41 @@ 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
gunzip php-4.0.x.tar.gz
tar xvf php-4.0.x.tar
cd apache_1.3.x
./configure --prefix=/www
cd ../php-3.0.x
cd ../php-4.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
./configure --prefix=/www --activate-module=src/modules/php4/libphp4.a
(The above line is correct! Yes, we know libphp4.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.
cd ../php-4.0.x
cp php.ini-dist /usr/local/lib/php.ini
You can edit /usr/local/lib/php.ini file to set PHP options.
Edit your httpd.conf or srm.conf file and add:
AddType application/x-httpd-php3 .php3
AddType application/x-httpd-php .php
VERBOSE INSTALL
Installing PHP3 can be done in four simple steps:
Installing PHP 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
You will have downloaded a file named something like php4xn.tar.gz.
Unzip this file with a command like: gunzip php4xn.tar.gz
Next you have to untar it with: tar -xvf php3xn.tar
Next you have to untar it with: tar -xvf php4xn.tar
This will create a php-3.0.x directory. cd into this new directory.
This will create a php-4.0.x directory. cd into this new directory.
2. Configure PHP3.
2. Configure PHP.
You now have to choose the options you would like. There are quite
a few of them. To see a list, type: ./configure --help
@@ -81,7 +81,7 @@ Installing PHP3 can be done in four simple steps:
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
to the src/modules/php4 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.
@@ -90,7 +90,7 @@ Installing PHP3 can be done in four simple steps:
cd apache_1.3.x
./configure --prefix=/<path>/apache \
--activate-module=src/modules/php3/libphp3.a
--activate-module=src/modules/php4/libphp4.a
make
make install
@@ -103,29 +103,29 @@ Installing PHP3 can be done in four simple steps:
For Apache 1.3.x add:
AddModule modules/php3/libphp3.a
AddModule modules/php4/libphp4.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
Module php4_module mod_php4.o
For Apache 1.2.x you will also have to look in the libphp3.module file,
For Apache 1.2.x you will also have to look in the libphp4.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
the LIBS line in libphp4.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
EXTRA_LIBS=-L. -lphp4 -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.
is in the libphp4.module file.
Also, look at the RULE_WANTHSREGEX setting in the libphp3.module file
Also, look at the RULE_WANTHSREGEX setting in the libphp4.module file
and set the WANTHSREGEX directive accordingly in your Configuration file.
This last step applies to versions of Apache prior to 1.3b3.
@@ -144,13 +144,13 @@ Installing PHP3 can be done in four simple steps:
a backup of your previous one first. Then edit your conf/srm.conf file
and add the line:
AddType application/x-httpd-php3 .php3
AddType application/x-httpd-php .php
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
AddType application/x-httpd-php-source .phps
Any file ending in .phps will now be displayed with full colour syntax
highlighting instead of being executed.
+50 -51
View File
@@ -1,64 +1,63 @@
--------------------------------------------------------------------
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:
--------------------------------------------------------------------
The PHP License, version 2.0
Copyright (c) 1999 The PHP Group. All rights reserved.
--------------------------------------------------------------------
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.
Redistribution and use in source and binary forms, with or without
modification, is permitted provided that the following conditions
are met:
2. Redistributions of source code must retain the above copyright
1. 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
2. Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
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"
3. The name "PHP" must not be used to endorse or promote products
derived from this software without prior permission from the
PHP Group. 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.
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
4. The PHP Group reserves the right to modify the PHP license at
any time and without prior notice, as long as the changes keep
the free and open source nature of PHP.
5. 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 product includes PHP, freely available from
http://www.php.net/".
--------------------------------------------------------------------
6. Permission to freely distribute and use Zend as an integrated
part of PHP is granted, under the conditions of version 0.91
of the Zend License.
The license is bundled with the Zend engine, and is available
at http://www.zend.com/license/0_91.txt, or by contacting
license@zend.com.
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>.
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 Group.
The PHP Group can be contacted via Email at php-group@php.net.
For more information on the PHP Group and the PHP project,
please see <http://www.php.net>.
+16
View File
@@ -0,0 +1,16 @@
Module Status
------ ------
MySQL Working
COM Working
WDDX Not yet ported
PCRE Working
DBA Not yet ported
mcrypt Working
mhash Working
dbase Working
aspell Working
imap Working
ldap Working
oci8 Working (but no blob-support yet)
oracle Working
iptc Working
+101 -948
View File
File diff suppressed because it is too large. Load diff
+17
View File
@@ -0,0 +1,17 @@
How to install PHP with the BCMath arbitrary precision math library?
--------------------------------------------------------------------
Due to license restrictions, the BC math library can no longer be distributed
along with PHP. The BC math library is distributed under the restrictive
GNU Public License, and PHP is no longer distributed under that license, but
under a less restrictive license, the PHP License.
If you want to enable BC math support (recommended), all you have to do is
simply download http://www.php.net/extra/number4.tar.gz, and untar it on the
top level php4 directory.
A typical way of doing this would be (assuming that you have lynx):
cd ~/php4
lynx -dump -source http://www.php.net/extra/number4.tar.gz | gzip -d | tar xvf -
The PHP Group
-59
View File
@@ -1,59 +0,0 @@
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.
+4
View File
@@ -0,0 +1,4 @@
## process this file with automake to produce Makefile.am
AUTOMAKE_OPTIONS=foreign
lib_LIBRARIES=libtsrm.a
libtsrm_a_SOURCES = TSRM.c
+392
View File
@@ -0,0 +1,392 @@
/*
+----------------------------------------------------------------------+
| Thread Safe Resource Manager |
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include "TSRM.h"
#include <stdio.h>
#include <stdlib.h>
#if HAVE_STDARG_H
#include <stdarg.h>
#endif
typedef struct _tsrm_tls_entry tsrm_tls_entry;
struct _tsrm_tls_entry {
void **storage;
int count;
THREAD_T thread_id;
tsrm_tls_entry *next;
};
typedef struct {
size_t size;
void (*ctor)(void *resource);
void (*dtor)(void *resource);
} tsrm_resource_type;
/* The memory manager table */
static tsrm_tls_entry **tsrm_tls_table;
static int tsrm_tls_table_size;
static ts_rsrc_id id_count;
/* The resource sizes table */
static tsrm_resource_type *resource_types_table;
static int resource_types_table_size;
static MUTEX_T tsmm_mutex; /* thread-safe memory manager mutex */
/* Debug support */
static int tsrm_debug(const char *format, ...);
static int tsrm_debug_status;
/* Startup TSRM (call once for the entire process) */
TSRM_FUNC int tsrm_startup(int expected_threads, int expected_resources, int debug_status)
{
tsrm_tls_table_size = expected_threads;
tsrm_tls_table = (tsrm_tls_entry **) calloc(tsrm_tls_table_size, sizeof(tsrm_tls_entry *));
if (!tsrm_tls_table) {
return 0;
}
id_count=0;
resource_types_table_size = expected_resources;
resource_types_table = (tsrm_resource_type *) calloc(resource_types_table_size, sizeof(tsrm_resource_type));
if (!resource_types_table) {
free(tsrm_tls_table);
return 0;
}
tsmm_mutex = tsrm_mutex_alloc();
tsrm_debug_status = debug_status;
tsrm_debug("Started up TSRM, %d expected threads, %d expected resources\n", expected_threads, expected_resources);
return 1;
}
/* Shutdown TSRM (call once for the entire process) */
TSRM_FUNC void tsrm_shutdown()
{
int i;
if (tsrm_tls_table) {
for (i=0; i<tsrm_tls_table_size; i++) {
tsrm_tls_entry *p = tsrm_tls_table[i], *next_p;
while (p) {
int j;
next_p = p->next;
for (j=0; j<id_count; j++) {
free(p->storage[j]);
}
free(p->storage);
free(p);
p = next_p;
}
}
free(tsrm_tls_table);
}
if (resource_types_table) {
free(resource_types_table);
}
tsrm_mutex_free(tsmm_mutex);
tsrm_debug("Shutdown TSRM\n");
}
/* allocates a new thread-safe-resource id */
TSRM_FUNC ts_rsrc_id ts_allocate_id(size_t size, void (*ctor)(void *resource), void (*dtor)(void *resource))
{
ts_rsrc_id new_id;
int i;
tsrm_debug("Obtaining a new resource id, %d bytes\n", size);
tsrm_mutex_lock(tsmm_mutex);
/* obtain a resource id */
new_id = id_count++;
tsrm_debug("Obtained resource id %d\n", new_id);
/* store the new resource type in the resource sizes table */
if (resource_types_table_size < id_count) {
resource_types_table = (tsrm_resource_type *) realloc(resource_types_table, sizeof(tsrm_resource_type)*id_count);
if (!resource_types_table) {
return -1;
}
resource_types_table_size = id_count;
}
resource_types_table[new_id].size = size;
resource_types_table[new_id].ctor = ctor;
resource_types_table[new_id].dtor = dtor;
/* enlarge the arrays for the already active threads */
for (i=0; i<tsrm_tls_table_size; i++) {
tsrm_tls_entry *p = tsrm_tls_table[i];
while (p) {
if (p->count < id_count) {
int j;
p->storage = (void *) realloc(p->storage, sizeof(void *)*id_count);
for (j=p->count; j<id_count; j++) {
p->storage[j] = (void *) malloc(resource_types_table[j].size);
if (resource_types_table[j].ctor) {
resource_types_table[j].ctor(p->storage[j]);
}
}
p->count = id_count;
}
p = p->next;
}
}
tsrm_mutex_unlock(tsmm_mutex);
tsrm_debug("Successfully allocated new resource id %d\n", new_id);
return new_id;
}
static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_T thread_id)
{
int i;
(*thread_resources_ptr) = (tsrm_tls_entry *) malloc(sizeof(tsrm_tls_entry));
(*thread_resources_ptr)->storage = (void **) malloc(sizeof(void *)*id_count);
(*thread_resources_ptr)->count = id_count;
(*thread_resources_ptr)->thread_id = thread_id;
(*thread_resources_ptr)->next = NULL;
for (i=0; i<id_count; i++) {
(*thread_resources_ptr)->storage[i] = (void *) malloc(resource_types_table[i].size);
if (resource_types_table[i].ctor) {
resource_types_table[i].ctor((*thread_resources_ptr)->storage[i]);
}
}
}
/* fetches the requested resource for the current thread */
void *ts_resource(ts_rsrc_id id)
{
THREAD_T thread_id = tsrm_thread_id();
int hash_value;
tsrm_tls_entry *thread_resources;
void *resource;
tsrm_debug("Fetching resource id %d for thread %ld\n", id, (long) thread_id);
tsrm_mutex_lock(tsmm_mutex);
hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size);
thread_resources = tsrm_tls_table[hash_value];
if (!thread_resources) {
allocate_new_resource(&tsrm_tls_table[hash_value], thread_id);
thread_resources = tsrm_tls_table[hash_value];
} else {
do {
if (thread_resources->thread_id == thread_id) {
break;
}
if (thread_resources->next) {
thread_resources = thread_resources->next;
} else {
allocate_new_resource(&thread_resources->next, thread_id);
thread_resources = thread_resources->next;
break;
}
} while (thread_resources);
}
resource = thread_resources->storage[id];
tsrm_mutex_unlock(tsmm_mutex);
tsrm_debug("Successfully fetched resource id %d for thread id %ld - %x\n", id, (long) thread_id, (long) resource);
return resource;
}
/* frees all resources allocated for the current thread */
void ts_free_thread()
{
THREAD_T thread_id = tsrm_thread_id();
int hash_value;
tsrm_tls_entry *thread_resources;
tsrm_tls_entry *last=NULL;
tsrm_mutex_lock(tsmm_mutex);
hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size);
thread_resources = tsrm_tls_table[hash_value];
while (thread_resources) {
if (thread_resources->thread_id == thread_id) {
int i;
for (i=0; i<thread_resources->count; i++) {
if (resource_types_table[i].dtor) {
resource_types_table[i].dtor(thread_resources->storage[i]);
}
free(thread_resources->storage[i]);
}
free(thread_resources->storage);
if (last) {
last->next = thread_resources->next;
} else {
tsrm_tls_table[hash_value]=NULL;
}
free(thread_resources);
break;
}
if (thread_resources->next) {
last = thread_resources;
}
thread_resources = thread_resources->next;
}
tsrm_mutex_unlock(tsmm_mutex);
}
/* deallocates all occurrences of a given id */
void ts_free_id(ts_rsrc_id id)
{
}
/*
* Utility Functions
*/
/* Obtain the current thread id */
TSRM_FUNC THREAD_T tsrm_thread_id(void)
{
#ifdef WIN32
return GetCurrentThreadId();
#elif defined(PTHREADS)
return pthread_self();
#elif defined(NSAPI)
return systhread_current();
#elif defined(PI3WEB)
return PIThread_getCurrent();
#endif
}
/* Allocate a mutex */
TSRM_FUNC MUTEX_T tsrm_mutex_alloc( void )
{
MUTEX_T mutexp;
#ifdef WIN32
mutexp = CreateMutex(NULL,FALSE,NULL);
#elif defined(PTHREADS)
mutexp = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
pthread_mutex_init(mutexp,NULL);
#elif defined(NSAPI)
mutexp = crit_init();
#elif defined(PI3WEB)
mutexp = PIPlatform_allocLocalMutex();
#endif
#ifdef THR_DEBUG
printf("Mutex created thread: %d\n",mythreadid());
#endif
return( mutexp );
}
/* Free a mutex */
TSRM_FUNC void tsrm_mutex_free( MUTEX_T mutexp )
{
if (mutexp) {
#ifdef WIN32
CloseHandle(mutexp);
#elif defined(PTHREADS)
free(mutexp);
#elif defined(NSAPI)
crit_terminate(mutexp);
#elif defined(PI3WEB)
PISync_delete(mutexp)
#endif
}
#ifdef THR_DEBUG
printf("Mutex freed thread: %d\n",mythreadid());
#endif
}
/* Lock a mutex */
TSRM_FUNC int tsrm_mutex_lock( MUTEX_T mutexp )
{
//tsrm_debug("Mutex locked thread: %ld\n",tsrm_thread_id());
#ifdef WIN32
return WaitForSingleObject(mutexp,1000);
#elif defined(PTHREADS)
return pthread_mutex_lock(mutexp);
#elif defined(NSAPI)
return crit_enter(mutexp);
#elif defined(PI3WEB)
return PISync_lock(mutexp);
#endif
}
/* Unlock a mutex */
TSRM_FUNC int tsrm_mutex_unlock( MUTEX_T mutexp )
{
//tsrm_debug("Mutex unlocked thread: %ld\n",tsrm_thread_id());
#ifdef WIN32
return ReleaseMutex(mutexp);
#elif defined(PTHREADS)
return pthread_mutex_unlock(mutexp);
#elif defined(NSAPI)
return crit_exit(mutexp);
#elif defined(PI3WEB)
return PISync_unlock(mutexp);
#endif
}
/*
* Debug support
*/
static int tsrm_debug(const char *format, ...)
{
if (tsrm_debug_status) {
va_list args;
int size;
va_start(args, format);
size = vprintf(format, args);
va_end(args);
return size;
} else {
return 0;
}
}
void tsrm_debug_set(int status)
{
tsrm_debug_status = status;
}
+100
View File
@@ -0,0 +1,100 @@
# Microsoft Developer Studio Project File - Name="TSRM" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Static Library" 0x0104
CFG=TSRM - Win32 Debug_TS
!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 "TSRM.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 "TSRM.mak" CFG="TSRM - Win32 Debug_TS"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "TSRM - Win32 Debug_TS" (based on "Win32 (x86) Static Library")
!MESSAGE "TSRM - Win32 Release_TS" (based on "Win32 (x86) Static Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "TSRM - Win32 Debug_TS"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "TSRM___Win32_Debug_TS"
# PROP BASE Intermediate_Dir "TSRM___Win32_Debug_TS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug_TS"
# PROP Intermediate_Dir "Debug_TS"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /I "C:\Projects\TSRM" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /D "_DEBUG" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD BASE RSC /l 0x40d /d "_DEBUG"
# ADD RSC /l 0x40d /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ELSEIF "$(CFG)" == "TSRM - Win32 Release_TS"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "TSRM___Win32_Release_TS"
# PROP BASE Intermediate_Dir "TSRM___Win32_Release_TS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release_TS"
# PROP Intermediate_Dir "Release_TS"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "TSRM_EXPORTS" /YX /FD /c
# ADD BASE RSC /l 0x40d /d "NDEBUG"
# ADD RSC /l 0x40d /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ENDIF
# Begin Target
# Name "TSRM - Win32 Debug_TS"
# Name "TSRM - Win32 Release_TS"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\TSRM.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\TSRM.h
# End Source File
# End Group
# End Target
# End Project
+97
View File
@@ -0,0 +1,97 @@
/*
+----------------------------------------------------------------------+
| Thread Safe Resource Manager |
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _TSRM_H
#define _TSRM_H
#ifdef HAVE_CONFIG_H
# include "tsrm_config.h"
#endif
#if WIN32||WINNT
# include <windows.h>
#elif defined(PTHREADS)
# include <pthread.h>
#endif
typedef int ts_rsrc_id;
#if WIN32||WINNT
# ifdef TSRM_EXPORTS
# define TSRM_API __declspec(dllexport)
# else
# define TSRM_API __declspec(dllimport)
# endif
#else
# define TSRM_API
#endif
/* Define TSRM_FUNC */
#ifdef __cplusplus
#define TSRM_FUNC extern "C" TSRM_API
#else
#define TSRM_FUNC TSRM_API
#endif
/* Define THREAD_T and MUTEX_T */
#if defined(WIN32)
# define THREAD_T DWORD
# define MUTEX_T void *
#elif defined(PTHREADS)
# define THREAD_T pthread_t
# define MUTEX_T pthread_mutex_t *
#elif defined(NSAPI)
# define THREAD_T SYS_THREAD
# define MUTEX_T CRITICAL
#elif defined(PI3WEB)
# define THREAD_T PIThread *
# define MUTEX_T PISync *
#endif
#define THREAD_HASH_OF(thr,ts) thr%ts
/* startup/shutdown */
TSRM_FUNC int tsrm_startup(int expected_threads, int expected_resources, int debug_status);
TSRM_FUNC void tsrm_shutdown();
/* allocates a new thread-safe-resource id */
TSRM_FUNC ts_rsrc_id ts_allocate_id(size_t size, void (*ctor)(void *resource), void (*dtor)(void *resource));
/* fetches the requested resource for the current thread */
TSRM_FUNC void *ts_resource(ts_rsrc_id id);
/* frees all resources allocated for the current thread */
TSRM_FUNC void ts_free_thread();
/* deallocates all occurrences of a given id */
TSRM_FUNC void ts_free_id(ts_rsrc_id id);
/* Debug support */
TSRM_FUNC void tsrm_debug_set(int status);
/* utility functions */
TSRM_FUNC THREAD_T tsrm_thread_id(void);
TSRM_FUNC MUTEX_T tsrm_mutex_alloc(void);
TSRM_FUNC void tsrm_mutex_free(MUTEX_T mutexp);
TSRM_FUNC int tsrm_mutex_lock(MUTEX_T mutexp);
TSRM_FUNC int tsrm_mutex_unlock(MUTEX_T mutexp);
#endif /* _TSRM_H */
+7
View File
@@ -0,0 +1,7 @@
#undef PTHREADS
#ifdef DEFINE_TSRM_VERSION
# undef PACKAGE
# undef VERSION
#endif
Executable
+24
View File
@@ -0,0 +1,24 @@
#!/bin/sh
mv aclocal.m4 aclocal.m4.old 2>/dev/null
aclocal
if cmp aclocal.m4.old aclocal.m4 > /dev/null 2>&1; then
echo keeping ${1}aclocal.m4
mv aclocal.m4.old aclocal.m4
else
echo created or modified ${1}aclocal.m4
fi
autoheader
automake --add-missing --include-deps
mv configure configure.old 2>/dev/null
autoconf
if cmp configure.old configure > /dev/null 2>&1; then
echo keeping ${1}configure
mv configure.old configure
else
echo created or modified ${1}configure
fi
+24
View File
@@ -0,0 +1,24 @@
dnl $Id$
dnl
dnl Minimalistic configure.in for TSRM.
dnl
AC_INIT(TSRM.c)
AM_INIT_AUTOMAKE(TSRM, 1.0)
AM_CONFIG_HEADER(tsrm_config.h)
AC_PROG_CC
AC_PROG_CC_C_O
AC_PROG_RANLIB
AC_CHECK_LIB(pthread, pthread_create, [
AC_DEFINE(PTHREADS)
LIBS="$LIBS -lpthread"
],[
AC_MSG_ERROR(You need pthreads to build TSRM.)
])
AC_CHECK_HEADERS(stdarg.h)
AC_OUTPUT(Makefile)
+186
View File
@@ -0,0 +1,186 @@
// $Header$
// FlexLexer.h -- define interfaces for lexical analyzer classes generated
// by flex
// Copyright (c) 1993 The Regents of the University of California.
// All rights reserved.
//
// This code is derived from software contributed to Berkeley by
// Kent Williams and Tom Epperly.
//
// Redistribution and use in source and binary forms with or without
// modification are permitted provided that: (1) source distributions retain
// this entire copyright notice and comment, and (2) distributions including
// binaries display the following acknowledgement: ``This product includes
// software developed by the University of California, Berkeley and its
// contributors'' in the documentation or other materials provided with the
// distribution and in all advertising materials mentioning features or use
// of this software. Neither the name of the University nor the names of
// its contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
// This file defines FlexLexer, an abstract class which specifies the
// external interface provided to flex C++ lexer objects, and yyFlexLexer,
// which defines a particular lexer class.
//
// If you want to create multiple lexer classes, you use the -P flag
// to rename each yyFlexLexer to some other xxFlexLexer. You then
// include <FlexLexer.h> in your other sources once per lexer class:
//
// #undef yyFlexLexer
// #define yyFlexLexer xxFlexLexer
// #include <FlexLexer.h>
//
// #undef yyFlexLexer
// #define yyFlexLexer zzFlexLexer
// #include <FlexLexer.h>
// ...
#ifndef __FLEX_LEXER_H
// Never included before - need to define base class.
#define __FLEX_LEXER_H
#include <iostream.h>
extern "C++" {
struct yy_buffer_state;
typedef int yy_state_type;
class FlexLexer {
public:
virtual ~FlexLexer() { }
const char* YYText() { return yytext; }
int YYLeng() { return yyleng; }
virtual void
yy_switch_to_buffer( struct yy_buffer_state* new_buffer ) = 0;
virtual struct yy_buffer_state*
yy_create_buffer( istream* s, int size ) = 0;
virtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0;
virtual void yyrestart( istream* s ) = 0;
virtual int yylex() = 0;
// Call yylex with new input/output sources.
int yylex( istream* new_in, ostream* new_out = 0 )
{
switch_streams( new_in, new_out );
return yylex();
}
// Switch to new input/output streams. A nil stream pointer
// indicates "keep the current one".
virtual void switch_streams( istream* new_in = 0,
ostream* new_out = 0 ) = 0;
int lineno() const { return yylineno; }
int debug() const { return yy_flex_debug; }
void set_debug( int flag ) { yy_flex_debug = flag; }
protected:
char* yytext;
int yyleng;
int yylineno; // only maintained if you use %option yylineno
int yy_flex_debug; // only has effect with -d or "%option debug"
};
}
#endif
#if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce)
// Either this is the first time through (yyFlexLexerOnce not defined),
// or this is a repeated include to define a different flavor of
// yyFlexLexer, as discussed in the flex man page.
#define yyFlexLexerOnce
class yyFlexLexer : public FlexLexer {
public:
// arg_yyin and arg_yyout default to the cin and cout, but we
// only make that assignment when initializing in yylex().
yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 );
virtual ~yyFlexLexer();
void yy_switch_to_buffer( struct yy_buffer_state* new_buffer );
struct yy_buffer_state* yy_create_buffer( istream* s, int size );
void yy_delete_buffer( struct yy_buffer_state* b );
void yyrestart( istream* s );
virtual int yylex();
virtual void switch_streams( istream* new_in, ostream* new_out );
protected:
virtual int LexerInput( char* buf, int max_size );
virtual void LexerOutput( const char* buf, int size );
virtual void LexerError( const char* msg );
void yyunput( int c, char* buf_ptr );
int yyinput();
void yy_load_buffer_state();
void yy_init_buffer( struct yy_buffer_state* b, istream* s );
void yy_flush_buffer( struct yy_buffer_state* b );
int yy_start_stack_ptr;
int yy_start_stack_depth;
int* yy_start_stack;
void yy_push_state( int new_state );
void yy_pop_state();
int yy_top_state();
yy_state_type yy_get_previous_state();
yy_state_type yy_try_NUL_trans( yy_state_type current_state );
int yy_get_next_buffer();
istream* yyin; // input source for default LexerInput
ostream* yyout; // output sink for default LexerOutput
struct yy_buffer_state* yy_current_buffer;
// yy_hold_char holds the character lost when yytext is formed.
char yy_hold_char;
// Number of characters read into yy_ch_buf.
int yy_n_chars;
// Points to current character in buffer.
char* yy_c_buf_p;
int yy_init; // whether we need to initialize
int yy_start; // start state number
// Flag which is used to allow yywrap()'s to do buffer switches
// instead of setting up a fresh yyin. A bit of a hack ...
int yy_did_buffer_switch_on_eof;
// The following are not always needed, but may be depending
// on use of certain flex features (like REJECT or yymore()).
yy_state_type yy_last_accepting_state;
char* yy_last_accepting_cpos;
yy_state_type* yy_state_buf;
yy_state_type* yy_state_ptr;
char* yy_full_match;
int* yy_full_state;
int yy_full_lp;
int yy_lp;
int yy_looking_for_trail_begin;
int yy_more_flag;
int yy_more_len;
int yy_more_offset;
int yy_prev_more_offset;
};
#endif
+109 -30
View File
@@ -1,37 +1,116 @@
Zend Temporary License
======================
---------------------------------------------------------------------------
The Zend License, version 0.91
Copyright (C) 1999 Andi Gutmans & Zeev Suraski
---------------------------------------------------------------------------
This is a temporary license, that is in effect until the final Zend license
is available.
The Zend scripting engine library is a product of Andi Gutmans and
Zeev Suraski. It may be used and/or distributed under the terms of the
Q Public License (QPL) version 1.0, enclosed below.
* The final license will include the ability to distribute Zend freely,
as a part of PHP (in both compiled and source code formats). It may
(and probably will) allow to redistribute Zend under other circumstances
as well, but at the very least, it'll be freely distributed as a part
of PHP.
For more information about Zend please visit http://www.zend.com/
For license related questions please mail license@zend.com
* The source code in the Zend engine is the property of Andi Gutmans and
Zeev Suraski. Parts of this code are based on source code taken from
PHP 3.0, which may include several patches and enhancements that weren't
made by us (Andi&Zeev). If you're the author of such a patch and you're
not willing to give up ownership over your patch to us, please contact
us as soon as possible, so we can remove it. We're doing this so that
we'd be eligible to sell the Zend engine for uses other than PHP, most
notably - as an embedded part of possible commercial products that we'd
have.
===========================================================================
* Patches submitted to the Zend CVS automatically fall under this license,
and by submitting them you're implicitly giving up your ownership over
this patch to us.
THE Q PUBLIC LICENSE
version 1.0
* Until further notice, Zend is in a status of a closed beta test. That means
that only people that were explicitly given the right to access the Zend
CVS repository are allowed to use it. If you're reading this file and you
weren't explicitly given the right to access the Zend CVS repository from
either Andi Gutmans or Zeev Suraski - you're not supposed to have it - please
erase the Zend files from your system. When the closed beta period finishes,
the Zend CVS tree will be open for the public (in read-only mode, of course).
Copyright (C) 1999 Troll Tech AS, Norway.
Everyone is permitted to copy and
distribute this license document.
The intent of this license is to establish freedom to share and change the
software regulated by this license under the open source model.
This license applies to any software containing a notice placed by the
copyright holder saying that it may be distributed under the terms of
the Q Public License version 1.0. Such software is herein referred to as
the Software. This license covers modification and distribution of the
Software, use of third-party application programs based on the Software,
and development of free software which uses the Software.
Granted Rights
1. You are granted the non-exclusive rights set forth in this license
provided you agree to and comply with any and all conditions in this
license. Whole or partial distribution of the Software, or software
items that link with the Software, in any form signifies acceptance of
this license.
2. You may copy and distribute the Software in unmodified form provided
that the entire package, including - but not restricted to - copyright,
trademark notices and disclaimers, as released by the initial developer
of the Software, is distributed.
3. You may make modifications to the Software and distribute your
modifications, in a form that is separate from the Software, such as
patches. The following restrictions apply to modifications:
a. Modifications must not alter or remove any copyright notices in
the Software.
b. When modifications to the Software are released under this
license, a non-exclusive royalty-free right is granted to the
initial developer of the Software to distribute your modification
in future versions of the Software provided such versions remain
available under these terms in addition to any other license(s) of
the initial developer.
4. You may distribute machine-executable forms of the Software or
machine-executable forms of modified versions of the Software, provided
that you meet these restrictions:
a. You must include this license document in the distribution.
b. You must ensure that all recipients of the machine-executable forms
are also able to receive the complete machine-readable source code
to the distributed Software, including all modifications, without
any charge beyond the costs of data transfer, and place prominent
notices in the distribution explaining this.
c. You must ensure that all modifications included in the
machine-executable forms are available under the terms of this
license.
5. You may use the original or modified versions of the Software to
compile, link and run application programs legally developed by you
or by others.
6. You may develop application programs, reusable components and other
software items that link with the original or modified versions of the
Software. These items, when distributed, are subject to the following
requirements:
a. You must ensure that all recipients of machine-executable forms of
these items are also able to receive and use the complete
machine-readable source code to the items without any charge
beyond the costs of data transfer.
b. You must explicitly license all recipients of your items to use
and re-distribute original and modified versions of the items in
both machine-executable and source code forms. The recipients must
be able to do so without any charges whatsoever, and they must be
able to re-distribute to anyone they choose.
Any questions regarding Zend or this license should be addressed via Email to
zend@zend.com.
c. If the items are not available to the general public, and the
initial developer of the Software requests a copy of the items,
then you must supply one.
Limitations of Liability
In no event shall the initial developers or copyright holders be liable
for any damages whatsoever, including - but not restricted to - lost
revenue or profits or other direct, indirect, special, incidental or
consequential damages, even if they have been advised of the possibility
of such damages, except to the extent invariable law, if any, provides
otherwise.
No Warranty
The Software and this license document are provided AS IS with NO WARRANTY
OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE.
===========================================================================
+26
View File
@@ -0,0 +1,26 @@
## Process this file with automake to produce Makefile.in -*- makefile -*-
#CLEANFILES = zend-parser.c zend-parser.h zend-scanner.c zend-parser.output
AUTOMAKE_OPTIONS=foreign
noinst_LIBRARIES=libzend.a
libzend_a_SOURCES=\
zend-parser.y zend-scanner.l \
zend_alloc.c zend_compile.c zend_constants.c \
zend_execute.c zend_execute_API.c zend_highlight.c zend_llist.c \
zend_opcode.c zend_operators.c zend_ptr_stack.c zend_stack.c \
zend_variables.c zend.c zend_API.c zend_extensions.c zend_hash.c \
zend_list.c zend_indent.c
# automake isn't too clever about "non-standard" use of lex and yacc
zend-scanner.c: zend-scanner.l
$(LEX) -Pzend -ozend-scanner.c -i $(srcdir)/zend-scanner.l
zend-scanner.cc: zend-scanner.l
$(LEX) -+ -S$(srcdir)/flex.skl -Pzend -ozend-scanner.cc -i $(srcdir)/zend-scanner.l
zend-parser.h: zend-parser.c
zend-parser.c: zend-parser.y
$(YACC) -p zend -v -d $(srcdir)/zend-parser.y -o zend-parser.c
-145
View File
@@ -1,145 +0,0 @@
CC = @CC@
AR = ar rc
LIBNAME = libzend.a
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@ $(PROF_CFLAGS)
LDFLAGS = @LDFLAGS@ $(LDFLAGS_SHLIB) $(LDFLAGS_SHLIB_EXPORT)
RANLIB = @RANLIB@
YACC = @YACC@
SOURCE = zend_alloc.c zend_compile.c zend_constants.c zend_execute.c zend_execute_API.c \
zend_highlight.c zend_llist.c zend_opcode.c zend_operators.c zend_ptr_stack.c \
zend_stack.c zend_variables.c zend-parser.c zend-scanner.c zend.c zend_API.c zend_extensions.c \
zend_hash.c zend_list.c zend_indent.c
OBJS = zend_alloc.o zend_compile.o zend_constants.o zend_execute.o zend_execute_API.o \
zend_highlight.o zend_llist.o zend_opcode.o zend_operators.o zend_ptr_stack.o \
zend_stack.o zend_variables.o zend-parser.o zend-scanner.o zend.o zend_API.o zend_extensions.o \
zend_hash.o zend_list.o zend_indent.o
LIBS = @LIBS@
all: $(LIBNAME)
libzend.a: $(OBJS)
-rm -f libzend.a
$(AR) libzend.a $(OBJS)
$(RANLIB) libzend.a
zend-parser.h zend-parser.c: zend-parser.y
bison -p zend -v -d zend-parser.y -o zend-parser.c
zend-scanner.o:
$(CC) $(CFLAGS) -w -c zend-scanner.c
zend-scanner.c: zend-scanner.l
flex -Pzend -ozend-scanner.c -i zend-scanner.l
clean:
-rm -f libzend.a *.o
distclean: clean
-rm -f *-scanner.c *-parser.[ch] *.output
-rm -f config.status config.cache config.log
-rm -f Makefile Makefile.depend config.h
.c.o:
@rm -f $@
$(CC) $(CFLAGS) -c $< -o $@
@bn=`echo $@ | sed -e 's#functions/##'`; test -f $@ || \
(test "$@" != "$$bn" && test -f "$$bn" && mv $$bn $@)
parser-scanner: zend-parser.c zend-parser.h zend-scanner.c
depend: parser-scanner
$(CC) $(CFLAGS) -MM $(SOURCE) | perl -pe 's|regex/regex.h||;' > Makefile.depend
zend_alloc.o: zend_alloc.c zend.h config.h config.unix.h zend_errors.h \
zend_alloc.h zend_hash.h zend_llist.h zend_globals.h zend_stack.h \
zend_ptr_stack.h zend_compile.h zend-parser.h zend_execute.h
zend_compile.o: zend_compile.c zend.h config.h config.unix.h \
zend_errors.h zend_alloc.h zend_hash.h zend_llist.h zend_compile.h \
zend-parser.h zend_globals.h zend_stack.h zend_ptr_stack.h \
zend_execute.h zend_API.h modules.h zend_list.h zend_variables.h \
zend_operators.h
zend_constants.o: zend_constants.c zend.h config.h config.unix.h \
zend_errors.h zend_alloc.h zend_hash.h zend_llist.h zend_constants.h \
zend_variables.h zend_operators.h zend_globals.h zend_stack.h \
zend_ptr_stack.h zend_compile.h zend-parser.h zend_execute.h
zend_execute.o: zend_execute.c zend.h config.h config.unix.h \
zend_errors.h zend_alloc.h zend_hash.h zend_llist.h zend_compile.h \
zend-parser.h zend_globals.h zend_stack.h zend_ptr_stack.h \
zend_execute.h zend_API.h modules.h zend_list.h zend_variables.h \
zend_operators.h zend_constants.h zend_extensions.h
zend_execute_API.o: zend_execute_API.c zend.h config.h config.unix.h \
zend_errors.h zend_alloc.h zend_hash.h zend_llist.h zend_compile.h \
zend-parser.h zend_globals.h zend_stack.h zend_ptr_stack.h \
zend_execute.h zend_API.h modules.h zend_list.h zend_variables.h \
zend_operators.h zend_constants.h zend_extensions.h
zend_highlight.o: zend_highlight.c zend.h config.h config.unix.h \
zend_errors.h zend_alloc.h zend_hash.h zend_llist.h zend_compile.h \
zend-parser.h zend_globals.h zend_stack.h zend_ptr_stack.h \
zend_execute.h zend_highlight.h
zend_llist.o: zend_llist.c zend.h config.h config.unix.h zend_errors.h \
zend_alloc.h zend_hash.h zend_llist.h
zend_opcode.o: zend_opcode.c zend.h config.h config.unix.h \
zend_errors.h zend_alloc.h zend_hash.h zend_llist.h zend_compile.h \
zend-parser.h zend_globals.h zend_stack.h zend_ptr_stack.h \
zend_execute.h zend_variables.h zend_operators.h zend_extensions.h \
zend_API.h modules.h zend_list.h
zend_operators.o: zend_operators.c zend.h config.h config.unix.h \
zend_errors.h zend_alloc.h zend_hash.h zend_llist.h zend_operators.h \
zend_variables.h zend_globals.h zend_stack.h zend_ptr_stack.h \
zend_compile.h zend-parser.h zend_execute.h
zend_ptr_stack.o: zend_ptr_stack.c zend.h config.h config.unix.h \
zend_errors.h zend_alloc.h zend_hash.h zend_llist.h zend_ptr_stack.h
zend_stack.o: zend_stack.c zend.h config.h config.unix.h zend_errors.h \
zend_alloc.h zend_hash.h zend_llist.h zend_stack.h
zend_variables.o: zend_variables.c zend.h config.h config.unix.h \
zend_errors.h zend_alloc.h zend_hash.h zend_llist.h zend_API.h \
modules.h zend_list.h zend_globals.h zend_stack.h zend_ptr_stack.h \
zend_compile.h zend-parser.h zend_execute.h zend_constants.h \
zend_variables.h
zend-parser.o: zend-parser.c zend_compile.h zend.h config.h \
config.unix.h zend_errors.h zend_alloc.h zend_hash.h zend_llist.h \
zend-parser.h zend_globals.h zend_stack.h zend_ptr_stack.h \
zend_execute.h zend_list.h zend_API.h modules.h zend_variables.h \
zend_operators.h
zend-scanner.o: zend-scanner.c zend.h config.h config.unix.h \
zend_errors.h zend_alloc.h zend_hash.h zend_llist.h zend_compile.h \
zend-parser.h zend_globals.h zend_stack.h zend_ptr_stack.h \
zend_execute.h zend-scanner.h zend_highlight.h zend_constants.h \
zend_variables.h zend_operators.h
zend.o: zend.c zend.h config.h config.unix.h zend_errors.h \
zend_alloc.h zend_hash.h zend_llist.h zend_operators.h \
zend_variables.h zend_extensions.h zend_compile.h zend-parser.h \
zend_globals.h zend_stack.h zend_ptr_stack.h zend_execute.h modules.h \
zend_constants.h zend_list.h
zend_API.o: zend_API.c zend.h config.h config.unix.h zend_errors.h \
zend_alloc.h zend_hash.h zend_llist.h zend_variables.h zend_execute.h \
zend_compile.h zend-parser.h zend_globals.h zend_stack.h \
zend_ptr_stack.h zend_API.h modules.h zend_list.h zend_constants.h \
zend_operators.h
zend_extensions.o: zend_extensions.c zend_extensions.h zend_compile.h \
zend.h config.h config.unix.h zend_errors.h zend_alloc.h zend_hash.h \
zend_llist.h zend-parser.h zend_globals.h zend_stack.h \
zend_ptr_stack.h zend_execute.h
zend_hash.o: zend_hash.c zend.h config.h config.unix.h zend_errors.h \
zend_alloc.h zend_hash.h zend_llist.h
zend_list.o: zend_list.c zend.h config.h config.unix.h zend_errors.h \
zend_alloc.h zend_hash.h zend_llist.h zend_list.h zend_API.h \
modules.h zend_globals.h zend_stack.h zend_ptr_stack.h zend_compile.h \
zend-parser.h zend_execute.h
zend_indent.o: zend_indent.c zend.h config.h config.unix.h \
zend_errors.h zend_alloc.h zend_hash.h zend_llist.h zend_compile.h \
zend-parser.h zend_globals.h zend_stack.h zend_ptr_stack.h \
zend_execute.h zend_indent.h
# Local Variables:
# tab-width: 4
# End:
+2 -2
View File
@@ -49,8 +49,8 @@ features:
explanation - you can now call functions before they're declared!
* Added here-docs support.
* Added foreach. Two syntaxes supported:
foreach($val in array_expr) statement
foreach($key, $val in array_expr) statement
foreach(array_expr as $val) statement
foreach(array_expr as $key => $val) statement
* A true unset() implementation. A variable or element that is unset(), is now
sent to oblivion in its entirely, no trace remains from it.
* Output buffering support! Use ob_start() to begin output buffering, ob_end_flush()
-628
View File
@@ -1,628 +0,0 @@
# Microsoft Developer Studio Generated NMAKE File, Based on ZendCore.dsp
!IF "$(CFG)" == ""
CFG=ZendCore - Win32 Debug
!MESSAGE No configuration specified. Defaulting to ZendCore - Win32 Debug.
!ENDIF
!IF "$(CFG)" != "ZendCore - Win32 Release" && "$(CFG)" != "ZendCore - 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 "ZendCore.mak" CFG="ZendCore - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "ZendCore - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "ZendCore - 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
!IF "$(CFG)" == "ZendCore - Win32 Release"
OUTDIR=.\Release
INTDIR=.\Release
# Begin Custom Macros
OutDir=.\Release
# End Custom Macros
ALL : "$(OUTDIR)\ZendCore.lib"
CLEAN :
-@erase "$(INTDIR)\alloc.obj"
-@erase "$(INTDIR)\alloca.obj"
-@erase "$(INTDIR)\compile.obj"
-@erase "$(INTDIR)\constants.obj"
-@erase "$(INTDIR)\execute.obj"
-@erase "$(INTDIR)\highlight.obj"
-@erase "$(INTDIR)\llist.obj"
-@erase "$(INTDIR)\opcode.obj"
-@erase "$(INTDIR)\operators.obj"
-@erase "$(INTDIR)\ptr_stack.obj"
-@erase "$(INTDIR)\sprintf.obj"
-@erase "$(INTDIR)\stack.obj"
-@erase "$(INTDIR)\variables.obj"
-@erase "$(INTDIR)\vc60.idb"
-@erase "$(INTDIR)\zend.obj"
-@erase "$(INTDIR)\zend_API.obj"
-@erase "$(INTDIR)\zend_hash.obj"
-@erase "$(INTDIR)\zend_ini.obj"
-@erase "$(OUTDIR)\ZendCore.lib"
"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
CPP=cl.exe
CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /Fp"$(INTDIR)\ZendCore.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) $<
<<
RSC=rc.exe
BSC32=bscmake.exe
BSC32_FLAGS=/nologo /o"$(OUTDIR)\ZendCore.bsc"
BSC32_SBRS= \
LIB32=link.exe -lib
LIB32_FLAGS=/nologo /out:"$(OUTDIR)\ZendCore.lib"
LIB32_OBJS= \
"$(INTDIR)\alloc.obj" \
"$(INTDIR)\alloca.obj" \
"$(INTDIR)\compile.obj" \
"$(INTDIR)\constants.obj" \
"$(INTDIR)\execute.obj" \
"$(INTDIR)\highlight.obj" \
"$(INTDIR)\llist.obj" \
"$(INTDIR)\opcode.obj" \
"$(INTDIR)\operators.obj" \
"$(INTDIR)\ptr_stack.obj" \
"$(INTDIR)\sprintf.obj" \
"$(INTDIR)\stack.obj" \
"$(INTDIR)\variables.obj" \
"$(INTDIR)\zend.obj" \
"$(INTDIR)\zend_hash.obj" \
"$(INTDIR)\zend_ini.obj" \
"$(INTDIR)\zend_API.obj"
"$(OUTDIR)\ZendCore.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
$(LIB32) @<<
$(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
<<
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
OUTDIR=.\Debug
INTDIR=.\Debug
# Begin Custom Macros
OutDir=.\Debug
# End Custom Macros
ALL : ".\zend-scanner.c" ".\zend-parser.tab.h" ".\zend-parser.tab.c" ".\configuration-scanner.c" ".\configuration-parser.tab.h" ".\configuration-parser.tab.c" "$(OUTDIR)\ZendCore.lib" "$(OUTDIR)\ZendCore.bsc"
CLEAN :
-@erase "$(INTDIR)\alloc.obj"
-@erase "$(INTDIR)\alloc.sbr"
-@erase "$(INTDIR)\alloca.obj"
-@erase "$(INTDIR)\alloca.sbr"
-@erase "$(INTDIR)\compile.obj"
-@erase "$(INTDIR)\compile.sbr"
-@erase "$(INTDIR)\constants.obj"
-@erase "$(INTDIR)\constants.sbr"
-@erase "$(INTDIR)\execute.obj"
-@erase "$(INTDIR)\execute.sbr"
-@erase "$(INTDIR)\highlight.obj"
-@erase "$(INTDIR)\highlight.sbr"
-@erase "$(INTDIR)\llist.obj"
-@erase "$(INTDIR)\llist.sbr"
-@erase "$(INTDIR)\opcode.obj"
-@erase "$(INTDIR)\opcode.sbr"
-@erase "$(INTDIR)\operators.obj"
-@erase "$(INTDIR)\operators.sbr"
-@erase "$(INTDIR)\ptr_stack.obj"
-@erase "$(INTDIR)\ptr_stack.sbr"
-@erase "$(INTDIR)\sprintf.obj"
-@erase "$(INTDIR)\sprintf.sbr"
-@erase "$(INTDIR)\stack.obj"
-@erase "$(INTDIR)\stack.sbr"
-@erase "$(INTDIR)\variables.obj"
-@erase "$(INTDIR)\variables.sbr"
-@erase "$(INTDIR)\vc60.idb"
-@erase "$(INTDIR)\vc60.pdb"
-@erase "$(INTDIR)\zend.obj"
-@erase "$(INTDIR)\zend.sbr"
-@erase "$(INTDIR)\zend_API.obj"
-@erase "$(INTDIR)\zend_API.sbr"
-@erase "$(INTDIR)\zend_hash.obj"
-@erase "$(INTDIR)\zend_hash.sbr"
-@erase "$(INTDIR)\zend_ini.obj"
-@erase "$(INTDIR)\zend_ini.sbr"
-@erase "$(OUTDIR)\ZendCore.bsc"
-@erase "$(OUTDIR)\ZendCore.lib"
-@erase "configuration-parser.tab.c"
-@erase "configuration-parser.tab.h"
-@erase "configuration-scanner.c"
-@erase "zend-parser.tab.c"
-@erase "zend-parser.tab.h"
-@erase "zend-scanner.c"
"$(OUTDIR)" :
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
CPP=cl.exe
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FR"$(INTDIR)\\" /Fp"$(INTDIR)\ZendCore.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /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) $<
<<
RSC=rc.exe
BSC32=bscmake.exe
BSC32_FLAGS=/nologo /o"$(OUTDIR)\ZendCore.bsc"
BSC32_SBRS= \
"$(INTDIR)\alloc.sbr" \
"$(INTDIR)\alloca.sbr" \
"$(INTDIR)\compile.sbr" \
"$(INTDIR)\constants.sbr" \
"$(INTDIR)\execute.sbr" \
"$(INTDIR)\highlight.sbr" \
"$(INTDIR)\llist.sbr" \
"$(INTDIR)\opcode.sbr" \
"$(INTDIR)\operators.sbr" \
"$(INTDIR)\ptr_stack.sbr" \
"$(INTDIR)\sprintf.sbr" \
"$(INTDIR)\stack.sbr" \
"$(INTDIR)\variables.sbr" \
"$(INTDIR)\zend.sbr" \
"$(INTDIR)\zend_hash.sbr" \
"$(INTDIR)\zend_ini.sbr" \
"$(INTDIR)\zend_API.sbr"
"$(OUTDIR)\ZendCore.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
$(BSC32) @<<
$(BSC32_FLAGS) $(BSC32_SBRS)
<<
LIB32=link.exe -lib
LIB32_FLAGS=/nologo /out:"$(OUTDIR)\ZendCore.lib"
LIB32_OBJS= \
"$(INTDIR)\alloc.obj" \
"$(INTDIR)\alloca.obj" \
"$(INTDIR)\compile.obj" \
"$(INTDIR)\constants.obj" \
"$(INTDIR)\execute.obj" \
"$(INTDIR)\highlight.obj" \
"$(INTDIR)\llist.obj" \
"$(INTDIR)\opcode.obj" \
"$(INTDIR)\operators.obj" \
"$(INTDIR)\ptr_stack.obj" \
"$(INTDIR)\sprintf.obj" \
"$(INTDIR)\stack.obj" \
"$(INTDIR)\variables.obj" \
"$(INTDIR)\zend.obj" \
"$(INTDIR)\zend_hash.obj" \
"$(INTDIR)\zend_ini.obj" \
"$(INTDIR)\zend_API.obj"
"$(OUTDIR)\ZendCore.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
$(LIB32) @<<
$(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
<<
!ENDIF
!IF "$(NO_EXTERNAL_DEPS)" != "1"
!IF EXISTS("ZendCore.dep")
!INCLUDE "ZendCore.dep"
!ELSE
!MESSAGE Warning: cannot find "ZendCore.dep"
!ENDIF
!ENDIF
!IF "$(CFG)" == "ZendCore - Win32 Release" || "$(CFG)" == "ZendCore - Win32 Debug"
SOURCE=.\zend_alloc.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\alloc.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\alloc.obj" "$(INTDIR)\alloc.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\alloca.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\alloca.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\alloca.obj" "$(INTDIR)\alloca.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend_compile.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\compile.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\compile.obj" "$(INTDIR)\compile.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend_constants.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\constants.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\constants.obj" "$(INTDIR)\constants.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend_execute.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\execute.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\execute.obj" "$(INTDIR)\execute.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend_highlight.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\highlight.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\highlight.obj" "$(INTDIR)\highlight.sbr" : $(SOURCE) "$(INTDIR)" ".\zend-parser.tab.h"
!ENDIF
SOURCE=.\zend_llist.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\llist.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\llist.obj" "$(INTDIR)\llist.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend_opcode.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\opcode.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\opcode.obj" "$(INTDIR)\opcode.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend_operators.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\operators.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\operators.obj" "$(INTDIR)\operators.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend_ptr_stack.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\ptr_stack.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\ptr_stack.obj" "$(INTDIR)\ptr_stack.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\sprintf.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\sprintf.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\sprintf.obj" "$(INTDIR)\sprintf.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend_stack.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\stack.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\stack.obj" "$(INTDIR)\stack.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend_variables.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\variables.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\variables.obj" "$(INTDIR)\variables.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\zend.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\zend.obj" "$(INTDIR)\zend.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend_API.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\zend_API.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\zend_API.obj" "$(INTDIR)\zend_API.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend_hash.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\zend_hash.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\zend_hash.obj" "$(INTDIR)\zend_hash.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=.\zend_ini.c
!IF "$(CFG)" == "ZendCore - Win32 Release"
"$(INTDIR)\zend_ini.obj" : $(SOURCE) "$(INTDIR)"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
"$(INTDIR)\zend_ini.obj" "$(INTDIR)\zend_ini.sbr" : $(SOURCE) "$(INTDIR)"
!ENDIF
SOURCE=".\configuration-parser.y"
!IF "$(CFG)" == "ZendCore - Win32 Release"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
InputPath=".\configuration-parser.y"
".\configuration-parser.tab.c" ".\configuration-parser.tab.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
<<tempfile.bat
@echo off
bison -d -S "C:\Program Files\Cygnus\share\bison.simple" -p cfg configuration-parser.y
<<
!ENDIF
SOURCE=".\zend-parser.y"
!IF "$(CFG)" == "ZendCore - Win32 Release"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
InputPath=".\zend-parser.y"
".\zend-parser.tab.c" ".\zend-parser.tab.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
<<tempfile.bat
@echo off
bison -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p zend zend-parser.y
<<
!ENDIF
SOURCE=".\configuration-scanner.l"
!IF "$(CFG)" == "ZendCore - Win32 Release"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
InputPath=".\configuration-scanner.l"
".\configuration-scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
<<tempfile.bat
@echo off
flex -i -Pcfg -oconfiguration-scanner.c configuration-scanner.l
<<
!ENDIF
SOURCE=".\zend-scanner.l"
!IF "$(CFG)" == "ZendCore - Win32 Release"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
InputPath=".\zend-scanner.l"
".\zend-scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
<<tempfile.bat
@echo off
flex -i -Pzend -ozend-scanner.c zend-scanner.l
<<
!ENDIF
!ENDIF
+7 -204
View File
@@ -1,6 +1,10 @@
/* This is the default configuration file to read */
#define USE_CONFIG_FILE 1
/* these are defined by automake */
#undef PACKAGE
#undef VERSION
/* define uint by configure if it is missed (QNX and BSD derived) */
#undef uint
@@ -10,15 +14,6 @@
/* type check for in_addr_t */
#undef in_addr_t
/* Solaris YP check */
#undef SOLARIS_YP
/* Netscape LDAP SDK check */
#undef HAVE_NSLDAP
/* ImageMagick check */
#undef HAVE_LIBMAGICK
/* 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
@@ -29,219 +24,27 @@
/* 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 GNU gettext library (-lintl). */
#define HAVE_LIBINTL 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
/* Undefine if you want stricter XML/SGML compliance by default */
/* (this disables "<?expression?>" by default) */
#define DEFAULT_SHORT_OPEN_TAG 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 T_DEFAULT_SHORT_OPEN_TAG 1
/* 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 Cybercash MCK support */
#define HAVE_MCK 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 the ASPELL interface */
#define HAVE_ASPELL 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 and want to use libpam */
#define HAVE_LIBPAM 0
/* Define if you have the sendmail program available */
#define HAVE_SENDMAIL 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
#undef ZEND_DEBUG
/* Define if your system has the gettimeofday() call */
#define HAVE_GETTIMEOFDAY 0
/* Define if your system has the getrusage() call */
#define HAVE_GETRUSAGE 0
/* Define if your system has the putenv() library call */
#define HAVE_PUTENV 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 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 want to enable displaying source support. */
#define HAVE_DISPLAY_SOURCE 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 to enable yp/nis support */
#define HAVE_YP 0
/* Define to compile Zend thread safe */
#undef ZTS
+20
View File
@@ -0,0 +1,20 @@
dnl $Id$
dnl
dnl This file contains local autoconf functions.
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)
])
])
-52
View File
@@ -1,52 +0,0 @@
dnl $Id$
dnl
dnl This file contains local autoconf functions.
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)
])
])
# 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)])
Executable
+24
View File
@@ -0,0 +1,24 @@
#!/bin/sh
mv aclocal.m4 aclocal.m4.old 2>/dev/null
aclocal
if cmp aclocal.m4.old aclocal.m4 > /dev/null 2>&1; then
echo keeping ${1}aclocal.m4
mv aclocal.m4.old aclocal.m4
else
echo created or modified ${1}aclocal.m4
fi
autoheader
automake --add-missing --include-deps
mv configure configure.old 2>/dev/null
autoconf
if cmp configure.old configure > /dev/null 2>&1; then
echo keeping ${1}configure
mv configure.old configure
else
echo created or modified ${1}configure
fi
-274
View File
@@ -1,274 +0,0 @@
/* 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 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 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 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
/* Define if you have the resolv library (-lresolv). */
#define HAVE_LIBRESOLV 0
/* Define if you have libdl (used for dynamic linking) */
#define HAVE_LIBDL 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
#undef ZEND_DEBUG
/* Define if you want to enable memory limit support */
#define MEMORY_LIMIT 0
/* Define if you have broken sprintf function like SunOS 4 */
#define BROKEN_SPRINTF 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 inet_aton function. */
#undef HAVE_INET_ATON
/* 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 setitimer function. */
#undef HAVE_SETITIMER
/* 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 statfs function. */
#undef HAVE_STATFS
/* Define if you have the statvfs function. */
#undef HAVE_STATVFS
/* 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 <db.h> header file. */
#undef HAVE_DB_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 <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 <ndbm.h> header file. */
#undef HAVE_NDBM_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/resource.h> header file. */
#undef HAVE_SYS_RESOURCE_H
/* Define if you have the <sys/socket.h> header file. */
#undef HAVE_SYS_SOCKET_H
/* Define if you have the <sys/statfs.h> header file. */
#undef HAVE_SYS_STATFS_H
/* Define if you have the <sys/statvfs.h> header file. */
#undef HAVE_SYS_STATVFS_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 m library (-lm). */
#undef HAVE_LIBM
/* Define if you have the resolv library (-lresolv). */
#undef HAVE_LIBRESOLV
+20
View File
@@ -1,3 +1,22 @@
/*
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _CONFIG_UNIX_H
#define _CONFIG_UNIX_H
@@ -23,6 +42,7 @@
# define DL_HANDLE void *
# define ZEND_EXTENSIONS_SUPPORT 1
#else
# define DL_HANDLE void *
# define ZEND_EXTENSIONS_SUPPORT 0
#endif
+25 -5
View File
@@ -1,3 +1,23 @@
/*
+----------------------------------------------------------------------+
| Zend Engine |
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _ZEND_CONFIG_W32_H
#define _ZEND_CONFIG_W32_H
@@ -13,12 +33,13 @@ typedef unsigned int uint;
#define HAVE_DIRENT_H 0
#define HAVE_KILL 0
#define HAVE_GETPID 1
#ifdef inline
#undef inline
#endif
#define ZEND_DEBUG 1
#define zend_sprintf sprintf
/* Visual C++ doesn't really work with inline for C */
@@ -31,11 +52,10 @@ typedef unsigned int uint;
#define DL_HANDLE HMODULE
#define ZEND_EXTENSIONS_SUPPORT 1
#ifdef COMPILE_LIBZEND
#ifdef LIBZEND_EXPORTS
# define ZEND_API __declspec(dllexport)
#else
# define ZEND_API __declspec(dllimport)
#endif
#endif /* _ZEND_CONFIG_W32_H */
#endif /* _ZEND_CONFIG_W32_H */
+32 -72
View File
@@ -2,9 +2,11 @@ dnl $Id$
dnl Process this file with autoconf to produce a configure script.
AC_INIT(zend.c)
AC_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE(zend, 0.80A)
AM_CONFIG_HEADER(zend_config.h)
AM_SANITY_CHECK
AM_MAINTAINER_MODE
ZEND_VERSION=$VERSION
dnl We want this one before the checks, so the checks can modify CFLAGS.
test -z "$CFLAGS" && auto_cflags=1
@@ -12,19 +14,25 @@ test -z "$CFLAGS" && auto_cflags=1
dnl Checks for programs.
AC_PROG_YACC
if test "$YACC" != "bison -y"; then
AC_MSG_WARN(You will need bison if you'd want to regenerate the PHP 3.0 parsers.)
AC_MSG_WARN(You will need bison if you want to regenerate the Zend parser.)
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).)
AC_MSG_WARN(You will need bison 1.25 if you want to regenerate the Zend parser (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)
AM_PROG_LEX
dnl Hack to work around a Mac OS X cpp problem
dnl Known versions needing this workaround are 5.3 and 5.4
if test "$ac_cv_prog_gcc" = "yes" -a "`uname -s`" = "Rhapsody"; then
CPPFLAGS="$CPPFLAGS -traditional-cpp"
fi
dnl Ugly hack to get around a problem with gcc on AIX.
if test "$CC" = "gcc" -a "$ac_cv_prog_cc_g" = "yes" -a \
@@ -32,35 +40,6 @@ if test "$CC" = "gcc" -a "$ac_cv_prog_cc_g" = "yes" -a \
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
dnl Check for /usr/pkg/{lib,include} which is where NetBSD puts binary
dnl and source packages. This should be harmless on other OSs.
@@ -70,20 +49,6 @@ if test -d /usr/pkg/include -a -d /usr/pkg/lib ; then
LDFLAGS="$LDFLAGS -L/usr/pkg/lib"
fi
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, dlopen, [
# fake it
AC_DEFINE(HAVE_LIBDL) ], [
@@ -96,24 +61,6 @@ 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)
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)
AC_CHECK_LIB(resolv, __dn_skipname)
])
])
dnl Checks for header files.
AC_HEADER_STDC
@@ -133,9 +80,11 @@ 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 )
AC_CHECK_SIZEOF(void *, 4)
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 setitimer rint unsetenv strftime setsockopt tzset statvfs statfs inet_aton)
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 setitimer rint unsetenv strftime setsockopt tzset statvfs statfs inet_aton getpid kill)
AC_FUNC_UTIME_NULL
AC_FUNC_ALLOCA
AC_BROKEN_SPRINTF
@@ -143,7 +92,7 @@ AC_REPLACE_FUNCS(getopt)
AC_MSG_CHECKING(whether to include debugging symbols)
AC_ARG_ENABLE(debug,
[ --enable-debug Compile with debugging symbols],
[ --disable-debug Compile without debugging symbols],
[
if test "$enableval" = "yes"; then
AC_MSG_RESULT(yes)
@@ -158,12 +107,12 @@ AC_ARG_ENABLE(debug,
DEBUG_CFLAGS=""
fi
],[
AC_MSG_RESULT(no)
AC_DEFINE(ZEND_DEBUG,0)
DEBUG_CFLAGS=""
AC_MSG_RESULT(yes)
AC_DEFINE(ZEND_DEBUG,1)
DEBUG_CFLAGS="-g"
])
AC_SUBST(DEBUG_CFLAGS)
CFLAGS="$CFLAGS $DEBUG_CFLAGS"
AC_MSG_CHECKING(whether to enable a memory limit)
AC_ARG_ENABLE(memory-limit,
@@ -182,6 +131,17 @@ AC_ARG_ENABLE(memory-limit,
])
AC_MSG_CHECKING(whether to build Zend thread-safe)
AC_ARG_ENABLE(thread-safety,
[ --enable-thread-safety Whether to build Zend thread-safe.],[
AC_DEFINE(ZTS)
AC_MSG_RESULT(yes)
],[
AC_MSG_RESULT(no)
])
AC_SUBST(TSRM_DIR)
AC_SUBST(TSRM_LIB)
AC_SUBST(CFLAGS_SHLIB)
AC_SUBST(LDFLAGS_SHLIB)
AC_SUBST(LDFLAGS_SHLIB_EXPORT)
-8
View File
@@ -1,8 +0,0 @@
Index: zend_execute.c
===================================================================
RCS file: /repository/Zend/ZendCore/zend_execute.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -r1.25 -r1.26
17d16
< /* $Id$ */
+1541
View File
File diff suppressed because it is too large. Load diff
+39 -34
View File
@@ -1,24 +1,24 @@
# Microsoft Developer Studio Project File - Name="ZendCore" - Package Owner=<4>
# Microsoft Developer Studio Project File - Name="libzend" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Static Library" 0x0104
CFG=ZendCore - Win32 Debug
CFG=libzend - 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 "ZendCore.mak".
!MESSAGE NMAKE /f "libzend.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 "ZendCore.mak" CFG="ZendCore - Win32 Debug"
!MESSAGE NMAKE /f "libzend.mak" CFG="libzend - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "ZendCore - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "ZendCore - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE "libzend - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "libzend - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE
# Begin Project
@@ -28,22 +28,21 @@ CFG=ZendCore - Win32 Debug
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "ZendCore - Win32 Release"
!IF "$(CFG)" == "libzend - 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 Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "COMPILE_LIBZEND" /YX /FD /c
# ADD BASE RSC /l 0x40d /d "NDEBUG"
# ADD RSC /l 0x40d /d "NDEBUG"
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDebug" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDebug" /D "_LIB" /D "TSRM_EXPORTS" /D "LIBZEND_EXPORTS" /D "WIN32" /D "_MBCS" /D ZEND_DEBUG=0 /FR /FD /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x40d /d "NDebug"
# ADD RSC /l 0x40d /d "NDebug"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
@@ -51,22 +50,20 @@ LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
!ELSEIF "$(CFG)" == "libzend - 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 Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "COMPILE_LIBZEND" /FR /YX /FD /GZ /c
# ADD BASE RSC /l 0x40d /d "_DEBUG"
# ADD RSC /l 0x40d /d "_DEBUG"
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_Debug" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /D "_Debug" /D "_LIB" /D "LIBZEND_EXPORTS" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /D ZEND_DEBUG=1 /FR /YX /FD /GZ /c
# ADD BASE RSC /l 0x40d /d "_Debug"
# ADD RSC /l 0x40d /d "_Debug"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
@@ -78,21 +75,13 @@ LIB32=link.exe -lib
# Begin Target
# Name "ZendCore - Win32 Release"
# Name "ZendCore - Win32 Debug"
# Name "libzend - Win32 Release"
# Name "libzend - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\alloca.c
# End Source File
# Begin Source File
SOURCE=.\sprintf.c
# End Source File
# Begin Source File
SOURCE=".\zend-parser.c"
# End Source File
# Begin Source File
@@ -165,6 +154,10 @@ SOURCE=.\zend_ptr_stack.c
# End Source File
# Begin Source File
SOURCE=.\zend_sprintf.c
# End Source File
# Begin Source File
SOURCE=.\zend_stack.c
# End Source File
# Begin Source File
@@ -181,6 +174,10 @@ SOURCE=.\config.w32.h
# End Source File
# Begin Source File
SOURCE=.\FlexLexer.h
# End Source File
# Begin Source File
SOURCE=.\modules.h
# End Source File
# Begin Source File
@@ -271,7 +268,7 @@ SOURCE=.\zend_variables.h
SOURCE=".\zend-parser.y"
!IF "$(CFG)" == "ZendCore - Win32 Release"
!IF "$(CFG)" == "libzend - Win32 Release"
# Begin Custom Build
InputDir=.
@@ -287,7 +284,7 @@ BuildCmds= \
$(BuildCmds)
# End Custom Build
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
!ELSEIF "$(CFG)" == "libzend - Win32 Debug"
# Begin Custom Build
InputDir=.
@@ -314,9 +311,17 @@ BuildCmds= \
SOURCE=".\zend-scanner.l"
!IF "$(CFG)" == "ZendCore - Win32 Release"
!IF "$(CFG)" == "libzend - Win32 Release"
!ELSEIF "$(CFG)" == "ZendCore - Win32 Debug"
# Begin Custom Build
InputPath=".\zend-scanner.l"
"zend-scanner.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
flex -i -Pzend -ozend-scanner.c zend-scanner.l
# End Custom Build
!ELSEIF "$(CFG)" == "libzend - Win32 Debug"
# Begin Custom Build
InputPath=".\zend-scanner.l"
+363
View File
@@ -0,0 +1,363 @@
# Microsoft Developer Studio Project File - Name="libzendts" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Static Library" 0x0104
CFG=libzendts - Win32 Debug_TS
!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 "libzendts.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 "libzendts.mak" CFG="libzendts - Win32 Debug_TS"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "libzendts - Win32 Release_TS" (based on "Win32 (x86) Static Library")
!MESSAGE "libzendts - Win32 Debug_TS" (based on "Win32 (x86) Static Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "libzendts - Win32 Release_TS"
# PROP BASE Use_MFC 0
# PROP BASE Output_Dir "Release_TS"
# PROP BASE Intermediate_Dir "Release_TS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Output_Dir "Release_TS"
# PROP Intermediate_Dir "Release_TS"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDebug_TS" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /D "NDebug_TS" /D "_LIB" /D "TSRM_EXPORTS" /D "LIBZEND_EXPORTS" /D "ZTS" /D "WIN32" /D "_MBCS" /D ZEND_DEBUG=0 /FR /FD /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x40d /d "NDebug_TS"
# ADD RSC /l 0x40d /d "NDebug_TS"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ELSEIF "$(CFG)" == "libzendts - Win32 Debug_TS"
# PROP BASE Use_MFC 0
# PROP BASE Output_Dir "Debug_TS"
# PROP BASE Intermediate_Dir "Debug_TS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Output_Dir "Debug_TS"
# PROP Intermediate_Dir "Debug_TS"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_Debug_TS" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "." /D "_Debug_TS" /D "_LIB" /D "LIBZEND_EXPORTS" /D "TSRM_EXPORTS" /D "WIN32" /D "_MBCS" /D "ZTS" /D ZEND_DEBUG=1 /FR /YX /FD /GZ /c
# ADD BASE RSC /l 0x40d /d "_Debug_TS"
# ADD RSC /l 0x40d /d "_Debug_TS"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ENDIF
# Begin Target
# Name "libzendts - Win32 Release_TS"
# Name "libzendts - Win32 Debug_TS"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=".\zend-parser.c"
# End Source File
# Begin Source File
SOURCE=".\zend-scanner.cpp"
# End Source File
# Begin Source File
SOURCE=.\zend.c
# End Source File
# Begin Source File
SOURCE=.\zend_alloc.c
# End Source File
# Begin Source File
SOURCE=.\zend_API.c
# End Source File
# Begin Source File
SOURCE=.\zend_compile.c
# End Source File
# Begin Source File
SOURCE=.\zend_constants.c
# End Source File
# Begin Source File
SOURCE=.\zend_execute.c
# End Source File
# Begin Source File
SOURCE=.\zend_execute_API.c
# End Source File
# Begin Source File
SOURCE=.\zend_extensions.c
# End Source File
# Begin Source File
SOURCE=.\zend_hash.c
# End Source File
# Begin Source File
SOURCE=.\zend_highlight.c
# End Source File
# Begin Source File
SOURCE=.\zend_indent.c
# End Source File
# Begin Source File
SOURCE=.\zend_list.c
# End Source File
# Begin Source File
SOURCE=.\zend_llist.c
# End Source File
# Begin Source File
SOURCE=.\zend_opcode.c
# End Source File
# Begin Source File
SOURCE=.\zend_operators.c
# End Source File
# Begin Source File
SOURCE=.\zend_ptr_stack.c
# End Source File
# Begin Source File
SOURCE=.\zend_sprintf.c
# End Source File
# Begin Source File
SOURCE=.\zend_stack.c
# End Source File
# Begin Source File
SOURCE=.\zend_variables.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\config.w32.h
# End Source File
# Begin Source File
SOURCE=.\FlexLexer.h
# End Source File
# Begin Source File
SOURCE=.\modules.h
# End Source File
# Begin Source File
SOURCE=".\zend-parser.h"
# End Source File
# Begin Source File
SOURCE=".\zend-scanner.h"
# End Source File
# Begin Source File
SOURCE=.\zend.h
# End Source File
# Begin Source File
SOURCE=.\zend_alloc.h
# End Source File
# Begin Source File
SOURCE=.\zend_API.h
# End Source File
# Begin Source File
SOURCE=.\zend_compile.h
# End Source File
# Begin Source File
SOURCE=.\zend_constants.h
# End Source File
# Begin Source File
SOURCE=.\zend_errors.h
# End Source File
# Begin Source File
SOURCE=.\zend_execute.h
# End Source File
# Begin Source File
SOURCE=.\zend_extensions.h
# End Source File
# Begin Source File
SOURCE=.\zend_globals.h
# End Source File
# Begin Source File
SOURCE=.\zend_hash.h
# End Source File
# Begin Source File
SOURCE=.\zend_highlight.h
# End Source File
# Begin Source File
SOURCE=.\zend_indent.h
# End Source File
# Begin Source File
SOURCE=.\zend_list.h
# End Source File
# Begin Source File
SOURCE=.\zend_llist.h
# End Source File
# Begin Source File
SOURCE=.\zend_operators.h
# End Source File
# Begin Source File
SOURCE=.\zend_ptr_stack.h
# End Source File
# Begin Source File
SOURCE=.\zend_stack.h
# End Source File
# Begin Source File
SOURCE=.\zend_variables.h
# End Source File
# End Group
# Begin Group "Parsers"
# PROP Default_Filter "y"
# Begin Source File
SOURCE=".\zend-parser.y"
!IF "$(CFG)" == "libzendts - Win32 Release_TS"
# Begin Custom Build
InputDir=.
InputPath=".\zend-parser.y"
BuildCmds= \
bison --output=zend-parser.c -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p zend zend-parser.y
"$(InputDir)\zend-parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
"$(InputDir)\zend-parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
# End Custom Build
!ELSEIF "$(CFG)" == "libzendts - Win32 Debug_TS"
# Begin Custom Build
InputDir=.
InputPath=".\zend-parser.y"
BuildCmds= \
bison --output=zend-parser.c -v -d -S "C:\Program Files\Cygnus\share\bison.simple" -p zend zend-parser.y
"$(InputDir)\zend-parser.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
"$(InputDir)\zend-parser.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
$(BuildCmds)
# End Custom Build
!ENDIF
# End Source File
# End Group
# Begin Group "Scanners"
# PROP Default_Filter "l"
# Begin Source File
SOURCE=".\zend-scanner.l"
!IF "$(CFG)" == "libzendts - Win32 Release_TS"
# Begin Custom Build
InputPath=".\zend-scanner.l"
"zend-scanner.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
flex -+ -i -Sflex.skl -Pzend -ozend-scanner.cpp zend-scanner.l
# End Custom Build
!ELSEIF "$(CFG)" == "libzendts - Win32 Debug_TS"
# Begin Custom Build
InputPath=".\zend-scanner.l"
"zend-scanner.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
flex -+ -i -Sflex.skl -Pzend -ozend-scanner.cpp zend-scanner.l
# End Custom Build
!ENDIF
# End Source File
# End Group
# Begin Group "Text Files"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\LICENSE
# End Source File
# Begin Source File
SOURCE=.\ZEND_BUGS
# End Source File
# Begin Source File
SOURCE=.\ZEND_CHANGES
# End Source File
# End Group
# Begin Group "Resources"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\zend.ico
# End Source File
# End Group
# End Target
# End Project
+254 -228
View File
@@ -5,10 +5,13 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
@@ -40,106 +43,122 @@
%pure_parser
%expect 4
%left INCLUDE EVAL
%left T_INCLUDE T_EVAL
%left ','
%left LOGICAL_OR
%left LOGICAL_XOR
%left LOGICAL_AND
%right ZEND_PRINT
%left '=' PLUS_EQUAL MINUS_EQUAL MUL_EQUAL DIV_EQUAL CONCAT_EQUAL MOD_EQUAL AND_EQUAL OR_EQUAL XOR_EQUAL SHIFT_LEFT_EQUAL SHIFT_RIGHT_EQUAL
%left T_LOGICAL_OR
%left T_LOGICAL_XOR
%left T_LOGICAL_AND
%right T_PRINT
%left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL XT_OR_EQUAL T_SL_EQUAL T_SR_EQUAL
%left '?' ':'
%left BOOLEAN_OR
%left BOOLEAN_AND
%left T_BOOLEAN_OR
%left T_BOOLEAN_AND
%left '|'
%left '^'
%left '&'
%nonassoc IS_EQUAL IS_NOT_EQUAL
%nonassoc '<' IS_SMALLER_OR_EQUAL '>' IS_GREATER_OR_EQUAL
%left SHIFT_LEFT SHIFT_RIGHT
%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL
%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL
%left T_SL T_SR
%left '+' '-' '.'
%left '*' '/' '%'
%right '!' '~' INCREMENT DECREMENT INT_CAST DOUBLE_CAST STRING_CAST ARRAY_CAST OBJECT_CAST '@'
%right '!' '~' T_INC T_DEC T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST '@'
%right '['
%nonassoc NEW
%nonassoc T_NEW
%token T_EXIT
%token IF
%left ELSEIF
%left ELSE
%left ENDIF
%token LNUMBER
%token DNUMBER
%token STRING
%token VARIABLE
%token NUM_STRING
%token INLINE_HTML
%token CHARACTER
%token BAD_CHARACTER
%token ENCAPSED_AND_WHITESPACE
%token CONSTANT_ENCAPSED_STRING
%token ZEND_ECHO
%token DO
%token WHILE
%token ENDWHILE
%token FOR
%token ENDFOR
%token ZEND_FOREACH
%token T_IF
%left T_ELSEIF
%left T_ELSE
%left T_ENDIF
%token T_LNUMBER
%token T_DNUMBER
%token T_STRING
%token T_STRING_VARNAME
%token T_VARIABLE
%token T_NUM_STRING
%token T_INLINE_HTML
%token T_CHARACTER
%token T_BAD_CHARACTER
%token T_ENCAPSED_AND_WHITESPACE
%token T_CONSTANT_ENCAPSED_STRING
%token T_ECHO
%token T_DO
%token T_WHILE
%token T_ENDWHILE
%token T_FOR
%token T_ENDFOR
%token T_FOREACH
%token T_ENDFOREACH
%token ZEND_AS
%token SWITCH
%token ENDSWITCH
%token CASE
%token DEFAULT
%token BREAK
%token CONTINUE
%token CONTINUED_WHILE
%token CONTINUED_DOWHILE
%token CONTINUED_FOR
%token OLD_FUNCTION
%token FUNCTION
%token ZEND_CONST
%token RETURN
%token REQUIRE
%token ZEND_GLOBAL
%token ZEND_STATIC
%token ZEND_UNSET
%token T_AS
%token T_SWITCH
%token T_ENDSWITCH
%token T_CASE
%token T_DEFAULT
%token T_BREAK
%token T_CONTINUE
%token T_OLD_FUNCTION
%token T_FUNCTION
%token T_CONST
%token T_RETURN
%token T_REQUIRE
%token T_GLOBAL
%token T_STATIC
%token T_VAR
%token T_UNSET
%token T_ISSET
%token T_EMPTY
%token CLASS
%token EXTENDS
%token ZEND_OBJECT_OPERATOR
%token ZEND_DOUBLE_ARROW
%token ZEND_LIST
%token ZEND_ARRAY
%token VAR
%token ZEND_LINE
%token ZEND_FILE
%token ZEND_COMMENT
%token ZEND_ML_COMMENT
%token PHP_OPEN_TAG
%token PHP_OPEN_TAG_WITH_ECHO
%token PHP_CLOSE_TAG
%token T_CLASS
%token T_EXTENDS
%token T_OBJECT_OPERATOR
%token T_DOUBLE_ARROW
%token T_LIST
%token T_ARRAY
%token T_LINE
%token T_FILE
%token T_COMMENT
%token T_ML_COMMENT
%token T_OPEN_TAG
%token T_OPEN_TAG_WITH_ECHO
%token T_CLOSE_TAG
%token T_WHITESPACE
%token ZEND_HEREDOC
%token DOLLAR_OPEN_CURLY_BRACES
%token T_HEREDOC
%token T_DOLLAR_OPEN_CURLY_BRACES
%token T_CURLY_OPEN
%token T_PAAMAYIM_NEKUDOTAYIM
%token T_PHP_TRACK_VARS
%% /* Rules */
statement_list:
statement_list { do_extended_info(CLS_C); } statement { HANDLE_INTERACTIVE(); }
top_statement_list:
top_statement_list { do_extended_info(CLS_C); } top_statement { ELS_FETCH(); HANDLE_INTERACTIVE(); }
| /* empty */
;
top_statement:
statement
| declaration_statement { do_early_binding(CLS_C); }
;
inner_statement_list:
inner_statement_list { do_extended_info(CLS_C); } inner_statement { ELS_FETCH(); HANDLE_INTERACTIVE(); }
| /* empty */
;
inner_statement:
statement
| declaration_statement
;
statement:
'{' statement_list '}'
| IF '(' expr ')' { do_if_cond(&$3, &$4 CLS_CC); } statement { do_if_after_statement(&$4, 1 CLS_CC); } elseif_list else_single { do_if_end(CLS_C); }
| IF '(' expr ')' ':' { do_if_cond(&$3, &$4 CLS_CC); } statement_list { do_if_after_statement(&$4, 1 CLS_CC); } new_elseif_list new_else_single ENDIF ';' { do_if_end(CLS_C); }
| WHILE '(' { $1.u.opline_num = get_next_op_number(CG(active_op_array)); } expr ')' { do_while_cond(&$4, &$5 CLS_CC); } while_statement { do_while_end(&$1, &$5 CLS_CC); }
| DO { $1.u.opline_num = get_next_op_number(CG(active_op_array)); do_do_while_begin(CLS_C); } statement WHILE '(' expr ')' ';' { do_do_while_end(&$1, &$6 CLS_CC); }
| FOR
'{' inner_statement_list '}'
| T_IF '(' expr ')' { do_if_cond(&$3, &$4 CLS_CC); } statement { do_if_after_statement(&$4, 1 CLS_CC); } elseif_list else_single { do_if_end(CLS_C); }
| T_IF '(' expr ')' ':' { do_if_cond(&$3, &$4 CLS_CC); } inner_statement_list { do_if_after_statement(&$4, 1 CLS_CC); } new_elseif_list new_else_single T_ENDIF ';' { do_if_end(CLS_C); }
| T_WHILE '(' { $1.u.opline_num = get_next_op_number(CG(active_op_array)); } expr ')' { do_while_cond(&$4, &$5 CLS_CC); } while_statement { do_while_end(&$1, &$5 CLS_CC); }
| T_DO { $1.u.opline_num = get_next_op_number(CG(active_op_array)); do_do_while_begin(CLS_C); } statement T_WHILE '(' expr ')' ';' { do_do_while_end(&$1, &$6 CLS_CC); }
| T_FOR
'('
for_expr
';' { do_free(&$3 CLS_CC); $4.u.opline_num = get_next_op_number(CG(active_op_array)); }
@@ -148,62 +167,65 @@ statement:
for_expr
')' { do_free(&$9 CLS_CC); do_for_before_statement(&$4, &$7 CLS_CC); }
for_statement { do_for_end(&$7 CLS_CC); }
| SWITCH '(' expr ')' { do_switch_cond(&$3 CLS_CC); } switch_case_list { do_switch_end(&$6 CLS_CC); }
| BREAK ';' { do_brk_cont(ZEND_BRK, NULL CLS_CC); }
| BREAK expr ';' { do_brk_cont(ZEND_BRK, &$2 CLS_CC); }
| CONTINUE ';' { do_brk_cont(ZEND_CONT, NULL CLS_CC); }
| CONTINUE expr ';' { do_brk_cont(ZEND_CONT, &$2 CLS_CC); }
| FUNCTION { $1.u.opline_num = CG(zend_lineno); } STRING { do_begin_function_declaration(&$1, &$3, 0 CLS_CC); }
'(' parameter_list ')' '{' statement_list '}' { do_end_function_declaration(&$1 CLS_CC); }
| OLD_FUNCTION { $1.u.opline_num = CG(zend_lineno); } STRING { do_begin_function_declaration(&$1, &$3, 0 CLS_CC); }
parameter_list '(' statement_list ')' ';' { do_end_function_declaration(&$1 CLS_CC); }
| RETURN ';' { do_return(NULL CLS_CC); }
| RETURN expr ';' { do_return(&$2 CLS_CC); }
| ZEND_GLOBAL global_var_list
| ZEND_STATIC static_var_list
| CLASS STRING { do_begin_class_declaration(&$2, NULL CLS_CC); } '{' class_statement_list '}' { do_end_class_declaration(CLS_C); }
| CLASS STRING EXTENDS STRING { do_begin_class_declaration(&$2, &$4 CLS_CC); } '{' class_statement_list '}' { do_end_class_declaration(CLS_C); }
| ZEND_ECHO echo_expr_list ';'
| INLINE_HTML { do_echo(&$1 CLS_CC); }
| T_SWITCH '(' expr ')' { do_switch_cond(&$3 CLS_CC); } switch_case_list { do_switch_end(&$6 CLS_CC); }
| T_BREAK ';' { do_brk_cont(ZEND_BRK, NULL CLS_CC); }
| T_BREAK expr ';' { do_brk_cont(ZEND_BRK, &$2 CLS_CC); }
| T_CONTINUE ';' { do_brk_cont(ZEND_CONT, NULL CLS_CC); }
| T_CONTINUE expr ';' { do_brk_cont(ZEND_CONT, &$2 CLS_CC); }
| T_RETURN ';' { do_return(NULL CLS_CC); }
| T_RETURN expr ';' { do_return(&$2 CLS_CC); }
| T_GLOBAL global_var_list
| T_STATIC static_var_list
| T_ECHO echo_expr_list ';'
| T_INLINE_HTML { do_echo(&$1 CLS_CC); }
| expr ';' { do_free(&$1 CLS_CC); }
| REQUIRE CONSTANT_ENCAPSED_STRING ';' { require_filename($2.u.constant.value.str.val CLS_CC); zval_dtor(&$2.u.constant); }
| REQUIRE '(' CONSTANT_ENCAPSED_STRING ')' ';' { require_filename($3.u.constant.value.str.val CLS_CC); zval_dtor(&$3.u.constant); }
| ZEND_UNSET '(' r_cvar ')' ';' { do_unset(&$3 CLS_CC); }
| ZEND_FOREACH '(' expr ZEND_AS { do_foreach_begin(&$1, &$3, &$2, &$4); } w_cvar foreach_optional_arg ')' { do_foreach_cont(&$6, &$7, &$4 CLS_CC); } foreach_statement { do_foreach_end(&$1, &$2 CLS_CC); }
| T_REQUIRE expr ';' { if ($2.op_type==IS_CONST && $2.u.constant.type==IS_STRING) { require_filename($2.u.constant.value.str.val CLS_CC); zval_dtor(&$2.u.constant); } else { do_include_or_eval(ZEND_INCLUDE, &$$, &$2 CLS_CC); } }
| T_UNSET '(' r_cvar ')' ';' { do_unset(&$3 CLS_CC); }
| T_FOREACH '(' expr T_AS { do_foreach_begin(&$1, &$3, &$2, &$4 CLS_CC); } w_cvar foreach_optional_arg ')' { do_foreach_cont(&$6, &$7, &$4 CLS_CC); } foreach_statement { do_foreach_end(&$1, &$2 CLS_CC); }
| ';' /* empty statement */
;
declaration_statement:
T_FUNCTION { $1.u.opline_num = CG(zend_lineno); } T_STRING { do_begin_function_declaration(&$1, &$3, 0 CLS_CC); }
'(' parameter_list ')' '{' inner_statement_list '}' { do_end_function_declaration(&$1 CLS_CC); }
| T_OLD_FUNCTION { $1.u.opline_num = CG(zend_lineno); } T_STRING { do_begin_function_declaration(&$1, &$3, 0 CLS_CC); }
parameter_list '(' inner_statement_list ')' ';' { do_end_function_declaration(&$1 CLS_CC); }
| T_CLASS T_STRING { do_begin_class_declaration(&$2, NULL CLS_CC); } '{' class_statement_list '}' { do_end_class_declaration(CLS_C); }
| T_CLASS T_STRING T_EXTENDS T_STRING { do_begin_class_declaration(&$2, &$4 CLS_CC); } '{' class_statement_list '}' { do_end_class_declaration(CLS_C); }
;
foreach_optional_arg:
/* empty */ { $$.op_type = IS_UNUSED; }
| ZEND_DOUBLE_ARROW w_cvar { $$ = $2; }
| T_DOUBLE_ARROW w_cvar { $$ = $2; }
;
for_statement:
statement
| ':' statement_list ENDFOR ';'
| ':' inner_statement_list T_ENDFOR ';'
;
foreach_statement:
statement
| ':' statement_list T_ENDFOREACH ';'
| ':' inner_statement_list T_ENDFOREACH ';'
;
switch_case_list:
'{' case_list '}' { $$ = $2; }
| '{' ';' case_list '}' { $$ = $3; }
| ':' case_list ENDSWITCH ';' { $$ = $2; }
| ':' ';' case_list ENDSWITCH ';' { $$ = $3; }
| ':' case_list T_ENDSWITCH ';' { $$ = $2; }
| ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; }
;
case_list:
/* empty */ { $$.u.opline_num = -1; }
| case_list CASE expr case_separator { do_case_before_statement(&$1, &$2, &$3 CLS_CC); } statement_list { do_case_after_statement(&$$, &$2 CLS_CC); }
| case_list DEFAULT case_separator { do_default_before_statement(&$1, &$2 CLS_CC); } statement_list { do_case_after_statement(&$$, &$2 CLS_CC); }
| case_list T_CASE expr case_separator { do_case_before_statement(&$1, &$2, &$3 CLS_CC); } inner_statement_list { do_case_after_statement(&$$, &$2 CLS_CC); }
| case_list T_DEFAULT case_separator { do_default_before_statement(&$1, &$2 CLS_CC); } inner_statement_list { do_case_after_statement(&$$, &$2 CLS_CC); }
;
@@ -215,32 +237,32 @@ case_separator:
while_statement:
statement
| ':' statement_list ENDWHILE ';'
| ':' inner_statement_list T_ENDWHILE ';'
;
elseif_list:
/* empty */
| elseif_list ELSEIF '(' expr ')' { do_if_cond(&$4, &$5 CLS_CC); } statement { do_if_after_statement(&$5, 0 CLS_CC); }
| elseif_list T_ELSEIF '(' expr ')' { do_if_cond(&$4, &$5 CLS_CC); } statement { do_if_after_statement(&$5, 0 CLS_CC); }
;
new_elseif_list:
/* empty */
| new_elseif_list ELSEIF '(' expr ')' ':' { do_if_cond(&$4, &$5 CLS_CC); } statement_list { do_if_after_statement(&$5, 0 CLS_CC); }
| new_elseif_list T_ELSEIF '(' expr ')' ':' { do_if_cond(&$4, &$5 CLS_CC); } inner_statement_list { do_if_after_statement(&$5, 0 CLS_CC); }
;
else_single:
/* empty */
| ELSE statement
| T_ELSE statement
;
new_else_single:
/* empty */
| ELSE ':' statement_list
| T_ELSE ':' inner_statement_list
;
@@ -253,27 +275,29 @@ parameter_list:
non_empty_parameter_list:
VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$1, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=0; $$.u.constant.type=IS_LONG; $$.u.constant.refcount=1; $$.u.constant.is_ref=0; do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_NONE CLS_CC); }
| '&' VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$2, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=0; $$.u.constant.type=IS_LONG; $$.u.constant.refcount=1; $$.u.constant.is_ref=0; do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_FORCE CLS_CC); }
| ZEND_CONST VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$2, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=0; $$.u.constant.type=IS_LONG; $$.u.constant.refcount=1; $$.u.constant.is_ref=0; do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_NONE CLS_CC); }
| VARIABLE '=' static_scalar { znode tmp; fetch_simple_variable(&tmp, &$1, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=0; $$.u.constant.type=IS_LONG; $$.u.constant.refcount=1; $$.u.constant.is_ref=0; do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, &$3, BYREF_NONE CLS_CC); }
| non_empty_parameter_list ',' VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$3, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_NONE CLS_CC); }
| non_empty_parameter_list ',' '&' VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$4, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_FORCE CLS_CC); }
| non_empty_parameter_list ',' ZEND_CONST VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$4, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_NONE CLS_CC); }
| non_empty_parameter_list ',' VARIABLE '=' static_scalar { znode tmp; fetch_simple_variable(&tmp, &$3, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, &$5, BYREF_NONE CLS_CC); }
T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$1, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=1; $$.u.constant.type=IS_LONG; INIT_PZVAL(&$$.u.constant); do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_NONE CLS_CC); }
| '&' T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$2, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=1; $$.u.constant.type=IS_LONG; INIT_PZVAL(&$$.u.constant); do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_FORCE CLS_CC); }
| T_CONST T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$2, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=1; $$.u.constant.type=IS_LONG; INIT_PZVAL(&$$.u.constant); do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_NONE CLS_CC); }
| T_VARIABLE '=' static_scalar { znode tmp; fetch_simple_variable(&tmp, &$1, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=1; $$.u.constant.type=IS_LONG; INIT_PZVAL(&$$.u.constant); do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, &$3, BYREF_NONE CLS_CC); }
| T_VARIABLE '=' T_UNSET { znode tmp; fetch_simple_variable(&tmp, &$1, 0 CLS_CC); $$.op_type = IS_CONST; $$.u.constant.value.lval=1; $$.u.constant.type=IS_LONG; INIT_PZVAL(&$$.u.constant); do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, NULL, BYREF_NONE CLS_CC); }
| non_empty_parameter_list ',' T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$3, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_NONE CLS_CC); }
| non_empty_parameter_list ',' '&' T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$4, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_FORCE CLS_CC); }
| non_empty_parameter_list ',' T_CONST T_VARIABLE { znode tmp; fetch_simple_variable(&tmp, &$4, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV, &tmp, &$$, NULL, BYREF_NONE CLS_CC); }
| non_empty_parameter_list ',' T_VARIABLE '=' static_scalar { znode tmp; fetch_simple_variable(&tmp, &$3, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, &$5, BYREF_NONE CLS_CC); }
| non_empty_parameter_list ',' T_VARIABLE '=' T_UNSET { znode tmp; fetch_simple_variable(&tmp, &$3, 0 CLS_CC); $$=$1; $$.u.constant.value.lval++; do_receive_arg(ZEND_RECV_INIT, &tmp, &$$, NULL, BYREF_NONE CLS_CC); }
;
function_call_parameter_list:
non_empty_function_call_parameter_list
| /* empty */
non_empty_function_call_parameter_list { $$ = $1; }
| /* empty */ { $$.u.constant.value.lval = 0; }
;
non_empty_function_call_parameter_list:
expr_without_variable { $$.u.constant.value.lval = 0; do_pass_param(&$1, ZEND_SEND_VAL, $$.u.constant.value.lval CLS_CC); }
| cvar { $$.u.constant.value.lval = 0; do_pass_param(&$1, ZEND_SEND_VAR, $$.u.constant.value.lval CLS_CC); }
| '&' w_cvar { $$.u.constant.value.lval = 0; do_pass_param(&$2, ZEND_SEND_REF, $$.u.constant.value.lval CLS_CC); }
expr_without_variable { $$.u.constant.value.lval = 1; do_pass_param(&$1, ZEND_SEND_VAL, $$.u.constant.value.lval CLS_CC); }
| cvar { $$.u.constant.value.lval = 1; do_pass_param(&$1, ZEND_SEND_VAR, $$.u.constant.value.lval CLS_CC); }
| '&' w_cvar { $$.u.constant.value.lval = 1; do_pass_param(&$2, ZEND_SEND_REF, $$.u.constant.value.lval CLS_CC); }
| non_empty_function_call_parameter_list ',' expr_without_variable { $$.u.constant.value.lval=$1.u.constant.value.lval+1; do_pass_param(&$3, ZEND_SEND_VAL, $$.u.constant.value.lval CLS_CC); }
| non_empty_function_call_parameter_list ',' cvar { $$.u.constant.value.lval=$1.u.constant.value.lval+1; do_pass_param(&$3, ZEND_SEND_VAR, $$.u.constant.value.lval CLS_CC); }
| non_empty_function_call_parameter_list ',' '&' w_cvar { $$.u.constant.value.lval=$1.u.constant.value.lval+1; do_pass_param(&$4, ZEND_SEND_REF, $$.u.constant.value.lval CLS_CC); }
@@ -286,17 +310,17 @@ global_var_list:
global_var:
VARIABLE { $$ = $1; }
T_VARIABLE { $$ = $1; }
| '$' r_cvar { $$ = $2; }
| '$' '{' expr '}' { $$ = $3; }
;
static_var_list:
static_var_list ',' VARIABLE { do_fetch_global_or_static_variable(&$3, NULL, ZEND_FETCH_STATIC CLS_CC); }
| static_var_list ',' VARIABLE '=' static_scalar { do_fetch_global_or_static_variable(&$3, &$5, ZEND_FETCH_STATIC CLS_CC); }
| VARIABLE { do_fetch_global_or_static_variable(&$1, NULL, ZEND_FETCH_STATIC CLS_CC); }
| VARIABLE '=' static_scalar { do_fetch_global_or_static_variable(&$1, &$3, ZEND_FETCH_STATIC CLS_CC); }
static_var_list ',' T_VARIABLE { do_fetch_global_or_static_variable(&$3, NULL, ZEND_FETCH_STATIC CLS_CC); }
| static_var_list ',' T_VARIABLE '=' static_scalar { do_fetch_global_or_static_variable(&$3, &$5, ZEND_FETCH_STATIC CLS_CC); }
| T_VARIABLE { do_fetch_global_or_static_variable(&$1, NULL, ZEND_FETCH_STATIC CLS_CC); }
| T_VARIABLE '=' static_scalar { do_fetch_global_or_static_variable(&$1, &$3, ZEND_FETCH_STATIC CLS_CC); }
;
@@ -308,20 +332,20 @@ class_statement_list:
class_statement:
VAR class_variable_decleration ';'
| FUNCTION { $1.u.opline_num = CG(zend_lineno); } STRING { do_begin_function_declaration(&$1, &$3, 1 CLS_CC); } '('
parameter_list ')' '{' statement_list '}' { do_end_function_declaration(&$1 CLS_CC); }
| OLD_FUNCTION { $1.u.opline_num = CG(zend_lineno); } STRING { do_begin_function_declaration(&$1, &$3, 1 CLS_CC); }
parameter_list '(' statement_list ')' ';' { do_end_function_declaration(&$1 CLS_CC); }
T_VAR class_variable_decleration ';'
| T_FUNCTION { $1.u.opline_num = CG(zend_lineno); } T_STRING { do_begin_function_declaration(&$1, &$3, 1 CLS_CC); } '('
parameter_list ')' '{' inner_statement_list '}' { do_end_function_declaration(&$1 CLS_CC); }
| T_OLD_FUNCTION { $1.u.opline_num = CG(zend_lineno); } T_STRING { do_begin_function_declaration(&$1, &$3, 1 CLS_CC); }
parameter_list '(' inner_statement_list ')' ';' { do_end_function_declaration(&$1 CLS_CC); }
;
class_variable_decleration:
class_variable_decleration ',' VARIABLE { do_declare_property(&$3, NULL CLS_CC); }
| class_variable_decleration ',' VARIABLE '=' static_scalar { do_declare_property(&$3, &$5 CLS_CC); }
| VARIABLE { do_declare_property(&$1, NULL CLS_CC); }
| VARIABLE '=' static_scalar { do_declare_property(&$1, &$3 CLS_CC); }
class_variable_decleration ',' T_VARIABLE { do_declare_property(&$3, NULL CLS_CC); }
| class_variable_decleration ',' T_VARIABLE '=' static_scalar { do_declare_property(&$3, &$5 CLS_CC); }
| T_VARIABLE { do_declare_property(&$1, NULL CLS_CC); }
| T_VARIABLE '=' static_scalar { do_declare_property(&$1, &$3 CLS_CC); }
;
@@ -334,36 +358,36 @@ echo_expr_list:
for_expr:
/* empty */ { $$.op_type = IS_CONST; $$.u.constant.type = IS_BOOL; $$.u.constant.value.lval = 1; }
| for_expr ',' expr { $$ = $3; }
| for_expr ',' { do_free(&$1 CLS_CC); } expr { $$ = $4; }
| expr { $$ = $1; }
;
expr_without_variable:
ZEND_LIST '(' { do_list_init(); } assignment_list ')' '=' expr { do_list_end(&$$, &$7 CLS_CC); }
T_LIST '(' { do_list_init(CLS_C); } assignment_list ')' '=' expr { do_list_end(&$$, &$7 CLS_CC); }
| w_cvar '=' expr { do_assign(&$$, &$1, &$3 CLS_CC); }
| w_cvar '=' '&' w_cvar { do_assign_ref(&$$, &$1, &$4 CLS_CC); }
| w_cvar '=' NEW class_name { do_extended_fcall_begin(CLS_C); do_begin_new_object(&$2, &$1, &$3, &$4 CLS_CC); } ctor_arguments { do_end_new_object(&$4, &$3 CLS_CC); do_extended_fcall_end(CLS_C); $$ = $2;}
| rw_cvar PLUS_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_ADD, &$$, &$1, &$3 CLS_CC); }
| rw_cvar MINUS_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_SUB, &$$, &$1, &$3 CLS_CC); }
| rw_cvar MUL_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_MUL, &$$, &$1, &$3 CLS_CC); }
| rw_cvar DIV_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_DIV, &$$, &$1, &$3 CLS_CC); }
| rw_cvar CONCAT_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_CONCAT, &$$, &$1, &$3 CLS_CC); }
| rw_cvar MOD_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_MOD, &$$, &$1, &$3 CLS_CC); }
| rw_cvar AND_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_BW_AND, &$$, &$1, &$3 CLS_CC); }
| rw_cvar OR_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_BW_OR, &$$, &$1, &$3 CLS_CC); }
| rw_cvar XOR_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_BW_XOR, &$$, &$1, &$3 CLS_CC); }
| rw_cvar SHIFT_LEFT_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_SL, &$$, &$1, &$3 CLS_CC); }
| rw_cvar SHIFT_RIGHT_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_SR, &$$, &$1, &$3 CLS_CC); }
| rw_cvar INCREMENT { do_post_incdec(&$$, &$1, ZEND_POST_INC CLS_CC); }
| INCREMENT rw_cvar { do_pre_incdec(&$$, &$2, ZEND_PRE_INC CLS_CC); }
| rw_cvar DECREMENT { do_post_incdec(&$$, &$1, ZEND_POST_DEC CLS_CC); }
| DECREMENT rw_cvar { do_pre_incdec(&$$, &$2, ZEND_PRE_DEC CLS_CC); }
| expr BOOLEAN_OR { do_boolean_or_begin(&$1, &$2 CLS_CC); } expr { do_boolean_or_end(&$$, &$1, &$4, &$2 CLS_CC); }
| expr BOOLEAN_AND { do_boolean_and_begin(&$1, &$2 CLS_CC); } expr { do_boolean_and_end(&$$, &$1, &$4, &$2 CLS_CC); }
| expr LOGICAL_OR { do_boolean_or_begin(&$1, &$2 CLS_CC); } expr { do_boolean_or_end(&$$, &$1, &$4, &$2 CLS_CC); }
| expr LOGICAL_AND { do_boolean_and_begin(&$1, &$2 CLS_CC); } expr { do_boolean_and_end(&$$, &$1, &$4, &$2 CLS_CC); }
| expr LOGICAL_XOR expr { do_binary_op(ZEND_BOOL_XOR, &$$, &$1, &$3 CLS_CC); }
| w_cvar '=' T_NEW class_name { do_extended_fcall_begin(CLS_C); do_begin_new_object(&$2, &$1, &$3, &$4 CLS_CC); } ctor_arguments { do_end_new_object(&$4, &$3, &$6 CLS_CC); do_extended_fcall_end(CLS_C); $$ = $2;}
| rw_cvar T_PLUS_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_ADD, &$$, &$1, &$3 CLS_CC); }
| rw_cvar T_MINUS_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_SUB, &$$, &$1, &$3 CLS_CC); }
| rw_cvar T_MUL_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_MUL, &$$, &$1, &$3 CLS_CC); }
| rw_cvar T_DIV_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_DIV, &$$, &$1, &$3 CLS_CC); }
| rw_cvar T_CONCAT_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_CONCAT, &$$, &$1, &$3 CLS_CC); }
| rw_cvar T_MOD_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_MOD, &$$, &$1, &$3 CLS_CC); }
| rw_cvar T_AND_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_BW_AND, &$$, &$1, &$3 CLS_CC); }
| rw_cvar T_OR_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_BW_OR, &$$, &$1, &$3 CLS_CC); }
| rw_cvar XT_OR_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_BW_XOR, &$$, &$1, &$3 CLS_CC); }
| rw_cvar T_SL_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_SL, &$$, &$1, &$3 CLS_CC); }
| rw_cvar T_SR_EQUAL expr { do_binary_assign_op(ZEND_ASSIGN_SR, &$$, &$1, &$3 CLS_CC); }
| rw_cvar T_INC { do_post_incdec(&$$, &$1, ZEND_POST_INC CLS_CC); }
| T_INC rw_cvar { do_pre_incdec(&$$, &$2, ZEND_PRE_INC CLS_CC); }
| rw_cvar T_DEC { do_post_incdec(&$$, &$1, ZEND_POST_DEC CLS_CC); }
| T_DEC rw_cvar { do_pre_incdec(&$$, &$2, ZEND_PRE_DEC CLS_CC); }
| expr T_BOOLEAN_OR { do_boolean_or_begin(&$1, &$2 CLS_CC); } expr { do_boolean_or_end(&$$, &$1, &$4, &$2 CLS_CC); }
| expr T_BOOLEAN_AND { do_boolean_and_begin(&$1, &$2 CLS_CC); } expr { do_boolean_and_end(&$$, &$1, &$4, &$2 CLS_CC); }
| expr T_LOGICAL_OR { do_boolean_or_begin(&$1, &$2 CLS_CC); } expr { do_boolean_or_end(&$$, &$1, &$4, &$2 CLS_CC); }
| expr T_LOGICAL_AND { do_boolean_and_begin(&$1, &$2 CLS_CC); } expr { do_boolean_and_end(&$$, &$1, &$4, &$2 CLS_CC); }
| expr T_LOGICAL_XOR expr { do_binary_op(ZEND_BOOL_XOR, &$$, &$1, &$3 CLS_CC); }
| expr '|' expr { do_binary_op(ZEND_BW_OR, &$$, &$1, &$3 CLS_CC); }
| expr '&' expr { do_binary_op(ZEND_BW_AND, &$$, &$1, &$3 CLS_CC); }
| expr '^' expr { do_binary_op(ZEND_BW_XOR, &$$, &$1, &$3 CLS_CC); }
@@ -373,43 +397,44 @@ expr_without_variable:
| expr '*' expr { do_binary_op(ZEND_MUL,&$$,&$1,&$3 CLS_CC); }
| expr '/' expr { do_binary_op(ZEND_DIV,&$$,&$1,&$3 CLS_CC); }
| expr '%' expr { do_binary_op(ZEND_MOD,&$$,&$1,&$3 CLS_CC); }
| expr SHIFT_LEFT expr { do_binary_op(ZEND_SL, &$$, &$1, &$3 CLS_CC); }
| expr SHIFT_RIGHT expr { do_binary_op(ZEND_SR, &$$, &$1, &$3 CLS_CC); }
| '+' expr { $1.u.constant.value.lval=0; $1.u.constant.type=IS_LONG; $1.op_type = IS_CONST; $1.u.constant.refcount=1; do_binary_op(ZEND_ADD, &$$, &$1, &$2 CLS_CC); }
| '-' expr { $1.u.constant.value.lval=0; $1.u.constant.type=IS_LONG; $1.op_type = IS_CONST; $1.u.constant.refcount=1; do_binary_op(ZEND_SUB, &$$, &$1, &$2 CLS_CC); }
| expr T_SL expr { do_binary_op(ZEND_SL, &$$, &$1, &$3 CLS_CC); }
| expr T_SR expr { do_binary_op(ZEND_SR, &$$, &$1, &$3 CLS_CC); }
| '+' expr { $1.u.constant.value.lval=0; $1.u.constant.type=IS_LONG; $1.op_type = IS_CONST; INIT_PZVAL(&$1.u.constant); do_binary_op(ZEND_ADD, &$$, &$1, &$2 CLS_CC); }
| '-' expr { $1.u.constant.value.lval=0; $1.u.constant.type=IS_LONG; $1.op_type = IS_CONST; INIT_PZVAL(&$1.u.constant); do_binary_op(ZEND_SUB, &$$, &$1, &$2 CLS_CC); }
| '!' expr { do_unary_op(ZEND_BOOL_NOT, &$$, &$2 CLS_CC); }
| '~' expr { do_unary_op(ZEND_BW_NOT, &$$, &$2 CLS_CC); }
| expr IS_EQUAL expr { do_binary_op(ZEND_IS_EQUAL, &$$, &$1, &$3 CLS_CC); }
| expr IS_NOT_EQUAL expr { do_binary_op(ZEND_IS_NOT_EQUAL, &$$, &$1, &$3 CLS_CC); }
| expr T_IS_EQUAL expr { do_binary_op(ZEND_IS_EQUAL, &$$, &$1, &$3 CLS_CC); }
| expr T_IS_NOT_EQUAL expr { do_binary_op(ZEND_IS_NOT_EQUAL, &$$, &$1, &$3 CLS_CC); }
| expr '<' expr { do_binary_op(ZEND_IS_SMALLER, &$$, &$1, &$3 CLS_CC); }
| expr IS_SMALLER_OR_EQUAL expr { do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &$$, &$1, &$3 CLS_CC); }
| expr T_IS_SMALLER_OR_EQUAL expr { do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &$$, &$1, &$3 CLS_CC); }
| expr '>' expr { do_binary_op(ZEND_IS_SMALLER, &$$, &$3, &$1 CLS_CC); }
| expr IS_GREATER_OR_EQUAL expr { do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &$$, &$3, &$1 CLS_CC); }
| expr T_IS_GREATER_OR_EQUAL expr { do_binary_op(ZEND_IS_SMALLER_OR_EQUAL, &$$, &$3, &$1 CLS_CC); }
| '(' expr ')' { $$ = $2; }
| expr '?' { do_begin_qm_op(&$1, &$2 CLS_CC); }
expr ':' { do_qm_true(&$4, &$2, &$5 CLS_CC); }
expr { do_qm_false(&$$, &$7, &$2, &$5 CLS_CC); }
| STRING '(' { do_extended_fcall_begin(CLS_C); do_begin_function_call(&$1 CLS_CC); }
| T_STRING '(' { do_extended_fcall_begin(CLS_C); do_begin_function_call(&$1 CLS_CC); }
function_call_parameter_list
')' { do_end_function_call(&$1, &$$, 0 CLS_CC); do_extended_fcall_end(CLS_C); }
')' { do_end_function_call(&$1, &$$, &$4, 0 CLS_CC); do_extended_fcall_end(CLS_C); }
| r_cvar '(' { do_extended_fcall_begin(CLS_C); do_begin_dynamic_function_call(&$1 CLS_CC); }
function_call_parameter_list
')' { do_end_function_call(&$1, &$$, 0 CLS_CC); do_extended_fcall_end(CLS_C);}
| STRING T_PAAMAYIM_NEKUDOTAYIM STRING '(' { do_extended_fcall_begin(CLS_C); do_begin_class_member_function_call(&$1, &$3 CLS_CC); }
')' { do_end_function_call(&$1, &$$, &$4, 0 CLS_CC); do_extended_fcall_end(CLS_C);}
| T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING '(' { do_extended_fcall_begin(CLS_C); do_begin_class_member_function_call(&$1, &$3 CLS_CC); }
function_call_parameter_list
')' { do_end_function_call(&$3, &$$, 1 CLS_CC); do_extended_fcall_end(CLS_C);}
')' { do_end_function_call(&$3, &$$, &$6, 1 CLS_CC); do_extended_fcall_end(CLS_C);}
| internal_functions_in_yacc { $$ = $1; }
| INT_CAST expr { do_cast(&$$, &$2, IS_LONG CLS_CC); }
| DOUBLE_CAST expr { do_cast(&$$, &$2, IS_DOUBLE CLS_CC); }
| STRING_CAST expr { do_cast(&$$, &$2, IS_STRING CLS_CC); }
| ARRAY_CAST expr { do_cast(&$$, &$2, IS_ARRAY CLS_CC); }
| OBJECT_CAST expr { do_cast(&$$, &$2, IS_OBJECT CLS_CC); }
| T_INT_CAST expr { do_cast(&$$, &$2, IS_LONG CLS_CC); }
| T_DOUBLE_CAST expr { do_cast(&$$, &$2, IS_DOUBLE CLS_CC); }
| T_STRING_CAST expr { do_cast(&$$, &$2, IS_STRING CLS_CC); }
| T_ARRAY_CAST expr { do_cast(&$$, &$2, IS_ARRAY CLS_CC); }
| T_OBJECT_CAST expr { do_cast(&$$, &$2, IS_OBJECT CLS_CC); }
| T_BOOL_CAST expr { do_cast(&$$, &$2, IS_BOOL CLS_CC); }
| T_EXIT exit_expr { do_exit(&$$, &$2 CLS_CC); }
| '@' { do_begin_silence(&$1 CLS_CC); } expr { do_end_silence(&$1 CLS_CC); $$ = $3; }
| scalar { $$ = $1; }
| ZEND_ARRAY '(' array_pair_list ')' { $$ = $3; }
| T_ARRAY '(' array_pair_list ')' { $$ = $3; }
| '`' encaps_list '`' { do_shell_exec(&$$, &$2 CLS_CC); }
| ZEND_PRINT expr { do_print(&$$, &$2 CLS_CC); }
| T_PRINT expr { do_print(&$$, &$2 CLS_CC); }
;
@@ -421,56 +446,57 @@ exit_expr:
ctor_arguments:
/* empty */
| '(' function_call_parameter_list ')'
/* empty */ { $$.u.constant.value.lval=0; }
| '(' function_call_parameter_list ')' { $$ = $2; }
;
class_name:
STRING { $$ = $1; }
T_STRING { $$ = $1; }
| r_cvar { $$ = $1; }
;
common_scalar:
LNUMBER { $$=$1; }
| DNUMBER { $$=$1; }
| CONSTANT_ENCAPSED_STRING { $$ = $1; }
| ZEND_LINE
| ZEND_FILE
T_LNUMBER { $$=$1; }
| T_DNUMBER { $$=$1; }
| T_CONSTANT_ENCAPSED_STRING { $$ = $1; }
| T_LINE { $$ = $1; }
| T_FILE { $$ = $1; }
;
static_scalar: /* compile-time evaluated scalars */
common_scalar { $$ = $1; }
| STRING { do_fetch_constant(&$$, &$1, ZEND_CT CLS_CC); }
| T_STRING { do_fetch_constant(&$$, &$1, ZEND_CT CLS_CC); }
| '+' static_scalar { $$ = $1; }
| '-' static_scalar { zval minus_one; minus_one.type = IS_LONG; minus_one.value.lval = -1; mul_function(&$2.u.constant, &$2.u.constant, &minus_one); $$ = $2; }
| ZEND_ARRAY '(' static_array_pair_list ')' { $$ = $3; }
| T_ARRAY '(' static_array_pair_list ')' { $$ = $3; }
;
scalar:
STRING { do_fetch_constant(&$$, &$1, ZEND_RT CLS_CC); }
T_STRING { do_fetch_constant(&$$, &$1, ZEND_RT CLS_CC); }
| T_STRING_VARNAME { $$ = $1; }
| common_scalar { $$ = $1; }
| '"' encaps_list '"' { $$ = $2; }
| '\'' encaps_list '\'' { $$ = $2; }
| ZEND_HEREDOC encaps_list ZEND_HEREDOC { $$ = $2; do_end_heredoc(CLS_C); }
| T_HEREDOC encaps_list T_HEREDOC { $$ = $2; do_end_heredoc(CLS_C); }
;
static_array_pair_list:
/* empty */ { $$.op_type = IS_CONST; $$.u.constant.refcount=1; $$.u.constant.is_ref=0; array_init(&$$.u.constant); }
/* empty */ { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); array_init(&$$.u.constant); }
| non_empty_static_array_pair_list { $$ = $1; }
;
non_empty_static_array_pair_list:
non_empty_static_array_pair_list ',' static_scalar ZEND_DOUBLE_ARROW static_scalar { do_add_static_array_element(&$$, &$3, &$5); }
| non_empty_static_array_pair_list ',' static_scalar { do_add_static_array_element(&$$, &$3, NULL); }
| static_scalar ZEND_DOUBLE_ARROW static_scalar { $$.op_type = IS_CONST; $$.u.constant.refcount=1; $$.u.constant.is_ref=0; array_init(&$$.u.constant); do_add_static_array_element(&$$, &$1, &$3); }
| static_scalar { $$.op_type = IS_CONST; $$.u.constant.refcount=1; $$.u.constant.is_ref=0; array_init(&$$.u.constant); do_add_static_array_element(&$$, &$1, NULL); }
non_empty_static_array_pair_list ',' static_scalar T_DOUBLE_ARROW static_scalar { do_add_static_array_element(&$$, &$3, &$5); }
| non_empty_static_array_pair_list ',' static_scalar { do_add_static_array_element(&$$, NULL, &$3); }
| static_scalar T_DOUBLE_ARROW static_scalar { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); array_init(&$$.u.constant); do_add_static_array_element(&$$, &$1, &$3); }
| static_scalar { $$.op_type = IS_CONST; INIT_PZVAL(&$$.u.constant); array_init(&$$.u.constant); do_add_static_array_element(&$$, NULL, &$1); }
;
expr:
@@ -497,7 +523,7 @@ rw_cvar:
cvar:
cvar_without_objects { $$ = $1; }
| cvar_without_objects ZEND_OBJECT_OPERATOR { do_push_object(&$1 CLS_CC); } ref_list { $$ = $4; }
| cvar_without_objects T_OBJECT_OPERATOR { do_push_object(&$1 CLS_CC); } ref_list { $$ = $4; }
;
@@ -509,19 +535,19 @@ cvar_without_objects:
reference_variable:
dim_list ']' { $$ = $1; }
| compound_variable { do_begin_variable_parse(CLS_C); fetch_simple_variable(&$$, &$1, 1 CLS_CC); }
| compound_variable { do_fetch_globals(&$1 CLS_CC); do_begin_variable_parse(CLS_C); fetch_simple_variable(&$$, &$1, 1 CLS_CC); }
;
compound_variable:
VARIABLE { $$ = $1; }
T_VARIABLE { $$ = $1; }
| '$' '{' expr '}' { $$ = $3; }
;
dim_list:
dim_list ']' '[' dim_offset { fetch_array_dim(&$$, &$1, &$4 CLS_CC); }
| compound_variable { do_begin_variable_parse(CLS_C); } '[' dim_offset { fetch_array_begin(&$$, &$1, &$4 CLS_CC); }
| compound_variable { do_fetch_globals(&$1 CLS_CC); do_begin_variable_parse(CLS_C); } '[' dim_offset { fetch_array_begin(&$$, &$1, &$4 CLS_CC); }
;
@@ -533,7 +559,7 @@ dim_offset:
ref_list:
object_property { $$ = $1; }
| ref_list ZEND_OBJECT_OPERATOR { do_push_object(&$1 CLS_CC); } object_property { $$ = $4; }
| ref_list T_OBJECT_OPERATOR { do_push_object(&$1 CLS_CC); } object_property { $$ = $4; }
;
object_property:
@@ -542,15 +568,15 @@ object_property:
;
scalar_object_property:
STRING { $$ = $1; }
T_STRING { $$ = $1; }
| '{' expr '}' { $$ = $2; }
| cvar_without_objects { do_end_variable_parse(BP_VAR_R CLS_CC); $$ = $1; }
;
object_dim_list:
object_dim_list ']' '[' expr { fetch_array_dim(&$$, &$1, &$4 CLS_CC); }
| STRING { znode tmp_znode, res; do_pop_object(&tmp_znode CLS_CC); do_fetch_property(&res, &tmp_znode, &$1 CLS_CC); $1 = res; } '[' expr { fetch_array_dim(&$$, &$1, &$4 CLS_CC); }
object_dim_list ']' '[' dim_offset { fetch_array_dim(&$$, &$1, &$4 CLS_CC); }
| T_STRING { znode tmp_znode, res; do_pop_object(&tmp_znode CLS_CC); do_fetch_property(&res, &tmp_znode, &$1 CLS_CC); $1 = res; } '[' dim_offset { fetch_array_dim(&$$, &$1, &$4 CLS_CC); }
;
@@ -567,7 +593,7 @@ assignment_list:
assignment_list_element:
w_cvar { do_add_list_element(&$1 CLS_CC); }
| ZEND_LIST '(' { do_new_list_begin(CLS_C); } assignment_list ')' { do_new_list_end(CLS_C); }
| T_LIST '(' { do_new_list_begin(CLS_C); } assignment_list ')' { do_new_list_end(CLS_C); }
| /* empty */ { do_add_list_element(NULL CLS_CC); }
;
@@ -578,53 +604,53 @@ array_pair_list:
;
non_empty_array_pair_list:
non_empty_array_pair_list ',' expr ZEND_DOUBLE_ARROW expr { do_add_array_element(&$$, &$5, &$3 CLS_CC); }
non_empty_array_pair_list ',' expr T_DOUBLE_ARROW expr { do_add_array_element(&$$, &$5, &$3 CLS_CC); }
| non_empty_array_pair_list ',' expr { do_add_array_element(&$$, &$3, NULL CLS_CC); }
| expr ZEND_DOUBLE_ARROW expr { do_init_array(&$$, &$3, &$1 CLS_CC); }
| expr T_DOUBLE_ARROW expr { do_init_array(&$$, &$3, &$1 CLS_CC); }
| expr { do_init_array(&$$, &$1, NULL CLS_CC); }
;
encaps_list:
encaps_list encaps_var { do_end_variable_parse(BP_VAR_R CLS_CC); do_add_variable(&$$, &$1, &$2 CLS_CC); }
| encaps_list STRING { do_add_string(&$$, &$1, &$2 CLS_CC); }
| encaps_list NUM_STRING { do_add_string(&$$, &$1, &$2 CLS_CC); }
| encaps_list ENCAPSED_AND_WHITESPACE { do_add_string(&$$, &$1, &$2 CLS_CC); }
| encaps_list CHARACTER { do_add_char(&$$, &$1, &$2 CLS_CC); }
| encaps_list BAD_CHARACTER { do_add_char(&$$, &$1, &$2 CLS_CC); }
| encaps_list T_STRING { do_add_string(&$$, &$1, &$2 CLS_CC); }
| encaps_list T_NUM_STRING { do_add_string(&$$, &$1, &$2 CLS_CC); }
| encaps_list T_ENCAPSED_AND_WHITESPACE { do_add_string(&$$, &$1, &$2 CLS_CC); }
| encaps_list T_CHARACTER { do_add_char(&$$, &$1, &$2 CLS_CC); }
| encaps_list T_BAD_CHARACTER { do_add_string(&$$, &$1, &$2 CLS_CC); }
| encaps_list '[' { $2.u.constant.value.chval = '['; do_add_char(&$$, &$1, &$2 CLS_CC); }
| encaps_list ']' { $2.u.constant.value.chval = ']'; do_add_char(&$$, &$1, &$2 CLS_CC); }
| encaps_list '{' { $2.u.constant.value.chval = '{'; do_add_char(&$$, &$1, &$2 CLS_CC); }
| encaps_list '}' { $2.u.constant.value.chval = '}'; do_add_char(&$$, &$1, &$2 CLS_CC); }
| encaps_list ZEND_OBJECT_OPERATOR { znode tmp; $2.u.constant.value.chval = '-'; do_add_char(&tmp, &$1, &$2 CLS_CC); $2.u.constant.value.chval = '>'; do_add_char(&$$, &tmp, &$2 CLS_CC); }
| /* empty */ { do_init_string(&$$); }
| encaps_list T_OBJECT_OPERATOR { znode tmp; $2.u.constant.value.chval = '-'; do_add_char(&tmp, &$1, &$2 CLS_CC); $2.u.constant.value.chval = '>'; do_add_char(&$$, &tmp, &$2 CLS_CC); }
| /* empty */ { do_init_string(&$$ CLS_CC); }
;
encaps_var:
VARIABLE { do_begin_variable_parse(CLS_C); fetch_simple_variable(&$$, &$1, 1 CLS_CC); }
| VARIABLE '[' encaps_var_offset ']' { do_begin_variable_parse(CLS_C); fetch_array_begin(&$$, &$1, &$3 CLS_CC); }
| VARIABLE ZEND_OBJECT_OPERATOR STRING { do_begin_variable_parse(CLS_C); fetch_simple_variable(&$2, &$1, 1 CLS_CC); do_fetch_property(&$$, &$2, &$3 CLS_CC); }
| DOLLAR_OPEN_CURLY_BRACES expr '}' { do_begin_variable_parse(CLS_C); fetch_simple_variable(&$$, &$2, 1 CLS_CC); }
| DOLLAR_OPEN_CURLY_BRACES STRING '[' expr ']' '}' { do_begin_variable_parse(CLS_C); fetch_array_begin(&$$, &$2, &$4 CLS_CC); }
T_VARIABLE { do_fetch_globals(&$1 CLS_CC); do_begin_variable_parse(CLS_C); fetch_simple_variable(&$$, &$1, 1 CLS_CC); }
| T_VARIABLE '[' { do_begin_variable_parse(CLS_C); } encaps_var_offset ']' { do_fetch_globals(&$1 CLS_CC); fetch_array_begin(&$$, &$1, &$4 CLS_CC); }
| T_VARIABLE T_OBJECT_OPERATOR T_STRING { do_begin_variable_parse(CLS_C); fetch_simple_variable(&$2, &$1, 1 CLS_CC); do_fetch_property(&$$, &$2, &$3 CLS_CC); }
| T_DOLLAR_OPEN_CURLY_BRACES expr '}' { do_begin_variable_parse(CLS_C); fetch_simple_variable(&$$, &$2, 1 CLS_CC); }
| T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}' { do_begin_variable_parse(CLS_C); fetch_array_begin(&$$, &$2, &$4 CLS_CC); }
| T_CURLY_OPEN cvar '}' { $$ = $2; }
;
encaps_var_offset:
STRING { $$ = $1; }
| NUM_STRING { $$ = $1; }
| { do_begin_variable_parse(CLS_C); } VARIABLE { fetch_simple_variable(&$$, &$2, 1 CLS_CC); }
T_STRING { $$ = $1; }
| T_NUM_STRING { $$ = $1; }
| T_VARIABLE { fetch_simple_variable(&$$, &$1, 1 CLS_CC); }
;
internal_functions_in_yacc:
T_ISSET '(' cvar ')' { do_isset_or_isempty(ZEND_ISSET, &$$, &$3 CLS_CC); }
| T_EMPTY '(' cvar ')' { do_isset_or_isempty(ZEND_ISEMPTY, &$$, &$3 CLS_CC); }
| INCLUDE expr { do_include_or_eval(ZEND_INCLUDE, &$$, &$2 CLS_CC); }
| EVAL '(' expr ')' { do_include_or_eval(ZEND_EVAL, &$$, &$3 CLS_CC); }
| T_INCLUDE expr { do_include_or_eval(ZEND_INCLUDE, &$$, &$2 CLS_CC); }
| T_EVAL '(' expr ')' { do_include_or_eval(ZEND_EVAL, &$$, &$3 CLS_CC); }
;
+28 -5
View File
@@ -4,20 +4,37 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _LANGUAGE_SCANNER_H
#define _LANGUAGE_SCANNER_H
typedef struct {
#ifdef ZTS
class ZendFlexLexer : public yyFlexLexer
{
public:
virtual ~ZendFlexLexer();
int lex_scan(zval *zendlval CLS_DC);
void BeginState(int state);
};
#endif /* ZTS */
#ifndef ZTS
typedef struct _zend_lex_state {
YY_BUFFER_STATE buffer_state;
int state;
uint return_offset;
@@ -25,5 +42,11 @@ typedef struct {
FILE *in;
char *filename;
} zend_lex_state;
#else
typedef struct _zend_lex_state {
ZendFlexLexer *ZFL;
istream *input_file;
} zend_lex_state;
#endif
#endif
+631 -341
View File
File diff suppressed because it is too large. Load diff
+235 -53
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include "zend.h"
#include "zend_operators.h"
#include "zend_variables.h"
@@ -21,9 +25,20 @@
#include "modules.h"
#include "zend_constants.h"
#include "zend_list.h"
#include "zend_API.h"
#ifdef ZTS
# define GLOBAL_FUNCTION_TABLE global_function_table
# define GLOBAL_CLASS_TABLE global_class_table
# define GLOBAL_CONSTANTS_TABLE global_constants_table
#else
# define GLOBAL_FUNCTION_TABLE CG(function_table)
# define GLOBAL_CLASS_TABLE CG(class_table)
# define GLOBAL_CONSTANTS_TABLE CG(zend_constants)
#endif
/* true multithread-shared globals */
zend_class_entry standard_class;
ZEND_API zend_class_entry zend_standard_class_def;
ZEND_API int (*zend_printf)(const char *format, ...);
ZEND_API int (*zend_write)(const char *str, uint str_length);
ZEND_API void (*zend_error)(int type, const char *format, ...);
@@ -31,6 +46,16 @@ void (*zend_message_dispatcher)(long message, void *data);
FILE *(*zend_fopen)(const char *filename);
void (*zend_block_interruptions)();
void (*zend_unblock_interruptions)();
ZEND_API int (*zend_get_ini_entry)(char *name, uint name_length, zval *contents);
#ifdef ZTS
ZEND_API int compiler_globals_id;
ZEND_API int executor_globals_id;
int alloc_globals_id;
HashTable *global_function_table;
HashTable *global_class_table;
HashTable *global_constants_table;
#endif
zend_utility_values zend_uv;
@@ -63,6 +88,7 @@ static void print_hash(HashTable *ht, int indent)
switch (zend_hash_get_current_key(ht, &string_key, &num_key)) {
case HASH_KEY_IS_STRING:
ZEND_PUTS(string_key);
efree(string_key);
break;
case HASH_KEY_IS_LONG:
zend_printf("%ld",num_key);
@@ -80,38 +106,83 @@ static void print_hash(HashTable *ht, int indent)
ZEND_PUTS(")\n");
}
ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_copy)
{
if (expr->type==IS_STRING) {
*use_copy = 0;
return;
}
switch (expr->type) {
case IS_BOOL:
#if 1
if (expr->value.lval) {
expr_copy->value.str.len = 1;
expr_copy->value.str.val = estrndup("1", 1);
} else {
expr_copy->value.str.len = 0;
expr_copy->value.str.val = empty_string;
}
#else
if (expr->value.lval) {
expr_copy->value.str.len = sizeof("true")-1;
expr_copy->value.str.val = estrndup("true", expr_copy->value.str.len);
} else {
expr_copy->value.str.len = sizeof("false")-1;
expr_copy->value.str.val = estrndup("false", expr_copy->value.str.len);
}
#endif
break;
case IS_RESOURCE:
expr_copy->value.str.val = (char *) emalloc(sizeof("Resource id #")-1 + MAX_LENGTH_OF_LONG);
expr_copy->value.str.len = sprintf(expr_copy->value.str.val, "Resource id #%ld", expr->value.lval);
break;
case IS_ARRAY:
expr_copy->value.str.len = sizeof("Array")-1;
expr_copy->value.str.val = estrndup("Array", expr_copy->value.str.len);
break;
case IS_OBJECT: {
zval function_name;
function_name.value.str.len = sizeof("to_string")-1;
function_name.value.str.val = estrndup("to_string", function_name.value.str.len);
function_name.type = IS_STRING;
if (call_user_function(NULL, expr, &function_name, expr_copy, 0, NULL)==FAILURE) {
expr_copy->value.str.len = sizeof("Object")-1;
expr_copy->value.str.val = estrndup("Object", expr_copy->value.str.len);
}
efree(function_name.value.str.val);
}
break;
default:
*expr_copy = *expr;
zval_copy_ctor(expr_copy);
convert_to_string(expr_copy);
break;
}
expr_copy->type = IS_STRING;
*use_copy = 1;
}
ZEND_API int zend_print_zval(zval *expr, int indent)
{
zval expr_copy;
int destroy=0;
int use_copy;
if (expr->type != IS_STRING) {
if (expr->type == IS_BOOL) {
if (expr->value.lval) {
expr_copy.value.str.val = estrndup("true",4);
expr_copy.value.str.len = 4;
} else {
expr_copy.value.str.val = estrndup("false",5);
expr_copy.value.str.len = 5;
}
expr_copy.type = IS_STRING;
} else if (expr->type == IS_RESOURCE) {
expr_copy.value.str.val = (char *) emalloc(sizeof("Resource id #")-1 + MAX_LENGTH_OF_LONG);
expr_copy.value.str.len = sprintf(expr_copy.value.str.val, "Resource id #%ld", expr->value.lval);
expr_copy.type = IS_STRING;
} else {
expr_copy = *expr;
zval_copy_ctor(&expr_copy);
convert_to_string(&expr_copy);
}
zend_make_printable_zval(expr, &expr_copy, &use_copy);
if (use_copy) {
expr = &expr_copy;
destroy=1;
}
if (expr->value.str.len==0) { /* optimize away empty strings */
if (use_copy) {
zval_dtor(expr);
}
return 0;
}
ZEND_WRITE(expr->value.str.val,expr->value.str.len);
if (destroy) {
if (use_copy) {
zval_dtor(expr);
}
return expr->value.str.len;
@@ -144,21 +215,84 @@ static FILE *zend_fopen_wrapper(const char *filename)
static void register_standard_class()
{
standard_class.type = ZEND_INTERNAL_CLASS;
standard_class.name_length = sizeof("stdClass") - 1;
standard_class.name = zend_strndup("stdClass", standard_class.name_length);
standard_class.parent = NULL;
zend_hash_init(&standard_class.default_properties, 0, NULL, PVAL_PTR_DTOR, 1);
zend_hash_init(&standard_class.function_table, 0, NULL, (void (*)(void *)) destroy_zend_function, 1);
standard_class.handle_function_call = NULL;
standard_class.handle_property_get = NULL;
standard_class.handle_property_set = NULL;
zend_hash_add(CG(class_table), "stdClass", sizeof("stdClass"), &standard_class, sizeof(zend_class_entry), NULL);
zend_standard_class_def.type = ZEND_INTERNAL_CLASS;
zend_standard_class_def.name_length = sizeof("stdClass") - 1;
zend_standard_class_def.name = zend_strndup("stdClass", zend_standard_class_def.name_length);
zend_standard_class_def.parent = NULL;
zend_hash_init(&zend_standard_class_def.default_properties, 0, NULL, PVAL_PTR_DTOR, 1);
zend_hash_init(&zend_standard_class_def.function_table, 0, NULL, ZEND_FUNCTION_DTOR, 1);
zend_standard_class_def.handle_function_call = NULL;
zend_standard_class_def.handle_property_get = NULL;
zend_standard_class_def.handle_property_set = NULL;
zend_standard_class_def.refcount = (int *) malloc(sizeof(int));
*zend_standard_class_def.refcount = 1;
zend_hash_add(GLOBAL_CLASS_TABLE, "stdClass", sizeof("stdClass"), &zend_standard_class_def, sizeof(zend_class_entry), NULL);
}
int zend_startup(zend_utility_functions *utility_functions, zend_utility_values *utility_values, char **extensions)
#ifdef ZTS
static void compiler_globals_ctor(zend_compiler_globals *compiler_globals)
{
zend_function tmp_func;
zend_class_entry tmp_class;
compiler_globals->function_table = (HashTable *) malloc(sizeof(HashTable));
zend_hash_init(compiler_globals->function_table, 100, NULL, ZEND_FUNCTION_DTOR, 1);
zend_hash_copy(compiler_globals->function_table, global_function_table, NULL, &tmp_func, sizeof(zend_function));
compiler_globals->class_table = (HashTable *) malloc(sizeof(HashTable));
zend_hash_init(compiler_globals->class_table, 10, NULL, ZEND_CLASS_DTOR, 1);
zend_hash_copy(compiler_globals->class_table, global_class_table, zend_class_add_ref, &tmp_class, sizeof(zend_class_entry));
}
static void compiler_globals_dtor(zend_compiler_globals *compiler_globals)
{
if (compiler_globals->function_table != global_function_table) {
zend_hash_destroy(compiler_globals->function_table);
free(compiler_globals->function_table);
}
if (compiler_globals->class_table != global_class_table) {
zend_hash_destroy(compiler_globals->class_table);
free(compiler_globals->class_table);
}
}
static void executor_globals_ctor(zend_executor_globals *executor_globals)
{
if (global_constants_table) {
zend_startup_constants(executor_globals->zend_constants ELS_CC);
zend_copy_constants(executor_globals->zend_constants, global_constants_table);
}
init_resource_plist(ELS_C);
}
static void executor_globals_dtor(zend_executor_globals *executor_globals)
{
zend_shutdown_constants(ELS_C);
destroy_resource_plist();
}
static void alloc_globals_ctor(zend_alloc_globals *alloc_globals)
{
start_memory_manager();
}
#endif
int zend_startup(zend_utility_functions *utility_functions, char **extensions)
{
#ifdef ZTS
zend_compiler_globals *compiler_globals;
zend_executor_globals *executor_globals;
alloc_globals_id = ts_allocate_id(sizeof(zend_alloc_globals), alloc_globals_ctor, NULL);
#endif
start_memory_manager();
/* Set up utility functions and values */
@@ -172,43 +306,71 @@ int zend_startup(zend_utility_functions *utility_functions, zend_utility_values
zend_message_dispatcher = utility_functions->message_handler;
zend_block_interruptions = utility_functions->block_interruptions;
zend_unblock_interruptions = utility_functions->unblock_interruptions;
zend_get_ini_entry = utility_functions->get_ini_entry;
zend_compile_files = compile_files;
zend_execute = execute;
zend_uv = *utility_values;
zend_llist_init(&zend_extensions, sizeof(zend_extension), (void (*)(void *)) zend_extension_dtor, 1);
/* set up version */
zend_version_info = strdup(ZEND_CORE_VERSION_INFO);
zend_version_info_length = sizeof(ZEND_CORE_VERSION_INFO)-1;
/* Prepare data structures */
zend_startup_constants();
CG(function_table) = (HashTable *) malloc(sizeof(HashTable));
CG(class_table) = (HashTable *) malloc(sizeof(HashTable));
zend_hash_init(CG(function_table), 100, NULL, (void (*)(void *)) destroy_zend_function, 1);
zend_hash_init(CG(class_table), 10, NULL, (void (*)(void *)) destroy_zend_class, 1);
GLOBAL_FUNCTION_TABLE = (HashTable *) malloc(sizeof(HashTable));
GLOBAL_CLASS_TABLE = (HashTable *) malloc(sizeof(HashTable));
zend_hash_init(GLOBAL_FUNCTION_TABLE, 100, NULL, ZEND_FUNCTION_DTOR, 1);
zend_hash_init(GLOBAL_CLASS_TABLE, 10, NULL, ZEND_CLASS_DTOR, 1);
register_standard_class();
zend_hash_init(&module_registry, 50, NULL, (void (*)(void *)) module_destructor, 1);
init_resource_plist();
zend_hash_init(&module_registry, 50, NULL, ZEND_MODULE_DTOR, 1);
zend_hash_init(&list_destructors, 50, NULL, NULL, 1);
#ifdef ZTS
global_constants_table = NULL;
compiler_globals_id = ts_allocate_id(sizeof(zend_compiler_globals), (void (*)(void *)) compiler_globals_ctor, (void (*)(void *)) compiler_globals_dtor);
executor_globals_id = ts_allocate_id(sizeof(zend_executor_globals), (void (*)(void *)) executor_globals_ctor, (void (*)(void *)) executor_globals_dtor);
compiler_globals = ts_resource(compiler_globals_id);
executor_globals = ts_resource(executor_globals_id);
compiler_globals_dtor(compiler_globals);
compiler_globals->function_table = GLOBAL_FUNCTION_TABLE;
compiler_globals->class_table = GLOBAL_CLASS_TABLE;
zend_startup_constants(EG(zend_constants), executor_globals);
GLOBAL_CONSTANTS_TABLE = EG(zend_constants);
#else
zend_startup_constants(EG(zend_constants));
#endif
zend_register_standard_constants(ELS_C);
#ifndef ZTS
init_resource_plist(ELS_C);
#endif
return SUCCESS;
}
void zend_shutdown()
{
#ifndef ZTS
destroy_resource_plist();
#endif
zend_hash_destroy(&list_destructors);
zend_hash_destroy(&module_registry);
zend_hash_destroy(CG(function_table));
free(CG(function_table));
zend_hash_destroy(CG(class_table));
free(CG(class_table));
zend_llist_destroy(&zend_extensions);
zend_hash_destroy(GLOBAL_FUNCTION_TABLE);
free(GLOBAL_FUNCTION_TABLE);
zend_hash_destroy(GLOBAL_CLASS_TABLE);
free(GLOBAL_CLASS_TABLE);
zend_shutdown_extensions();
free(zend_version_info);
zend_shutdown_constants();
#ifndef ZTS
zend_shutdown_constants(ELS_C);
#endif
}
void zend_set_utility_values(zend_utility_values *utility_values)
{
zend_uv = *utility_values;
}
@@ -219,12 +381,16 @@ void zenderror(char *error)
}
BEGIN_EXTERN_C()
ZEND_API void zend_bailout()
{
CLS_FETCH();
ELS_FETCH();
CG(unclean_shutdown) = 1;
longjmp(EG(bailout), FAILURE);
}
END_EXTERN_C()
void zend_append_version_info(zend_extension *extension)
@@ -253,3 +419,19 @@ ZEND_API char *get_zend_version()
{
return zend_version_info;
}
void zend_activate(CLS_D ELS_DC)
{
init_compiler(CLS_C ELS_CC);
init_executor(CLS_C ELS_CC);
startup_scanner(CLS_C);
}
void zend_deactivate(CLS_D ELS_DC)
{
zend_hash_apply(&module_registry, (int (*)(void *)) module_registry_cleanup);
shutdown_scanner(CLS_C);
shutdown_executor(ELS_C);
shutdown_compiler(CLS_C);
}
+64 -21
View File
@@ -4,20 +4,34 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _ZEND_H
#define _ZEND_H
#define ZEND_VERSION "0.80A"
#define ZEND_VERSION "0.90"
#ifdef __cplusplus
#define BEGIN_EXTERN_C() extern "C" {
#define END_EXTERN_C() }
#else
#define BEGIN_EXTERN_C()
#define END_EXTERN_C()
#endif
#include <stdio.h>
@@ -28,13 +42,19 @@
#if WINNT||WIN32
#include "config.w32.h"
#else
#include "config.h"
#include "zend_config.h"
#include "config.unix.h"
#endif
#include "zend_errors.h"
#include "zend_alloc.h"
/* this is a workaround for a bug in gcc */
#if SIZEOF_VOID_P == 8 || (1)
typedef unsigned int zend_bool;
#else
typedef unsigned char zend_bool;
#endif
#undef SUCCESS
#undef FAILURE
@@ -46,8 +66,8 @@
#include "zend_llist.h"
#define INTERNAL_FUNCTION_PARAMETERS HashTable *ht, zval *return_value, HashTable *list, HashTable *plist
#define INTERNAL_FUNCTION_PARAM_PASSTHRU ht, return_value, list, plist
#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, HashTable *list, HashTable *plist, zval *this_ptr
#define INTERNAL_FUNCTION_PARAM_PASSTHRU ht, return_value, list, plist, this_ptr
/*
* zval
@@ -55,7 +75,7 @@
typedef struct _zval_struct zval;
typedef struct _zend_class_entry zend_class_entry;
typedef union {
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
@@ -75,20 +95,23 @@ struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
unsigned char type; /* active type */
unsigned char is_ref;
struct {
unsigned int locks:7;
unsigned int is_ref:1;
} EA;
short refcount;
};
typedef struct {
typedef struct _zend_function_entry {
char *fname;
void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
unsigned char *func_arg_types;
} function_entry;
} zend_function_entry;
typedef struct {
typedef struct _zend_property_reference {
int type; /* read, write or r/w */
zval **object;
zend_llist elements_list;
@@ -96,7 +119,7 @@ typedef struct {
typedef struct {
typedef struct _zend_overloaded_element {
int type; /* array offset or object proprety */
zval element;
} zend_overloaded_element;
@@ -107,9 +130,11 @@ struct _zend_class_entry {
char *name;
uint name_length;
struct _zend_class_entry *parent;
int *refcount;
HashTable function_table;
HashTable default_properties;
zend_function_entry *builtin_functions;
/* handlers */
void (*handle_function_call)(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference);
@@ -119,7 +144,7 @@ struct _zend_class_entry {
typedef struct {
typedef struct _zend_utility_functions {
void (*error_function)(int type, const char *format, ...);
int (*printf_function)(const char *format, ...);
int (*write_function)(const char *str, uint str_length);
@@ -127,10 +152,11 @@ typedef struct {
void (*message_handler)(long message, void *data);
void (*block_interruptions)();
void (*unblock_interruptions)();
int (*get_ini_entry)(char *name, uint name_length, zval *contents);
} zend_utility_functions;
typedef struct {
typedef struct _zend_utility_values {
unsigned char short_tags;
unsigned char asp_tags;
} zend_utility_values;
@@ -153,11 +179,16 @@ typedef struct {
#define IS_CONSTANT 9
#define IS_METHOD 10 /* for overloaded function calls */
int zend_startup(zend_utility_functions *utility_functions, zend_utility_values *utility_values, char **extensions);
int zend_startup(zend_utility_functions *utility_functions, char **extensions);
void zend_shutdown();
void zend_set_utility_values(zend_utility_values *utility_values);
BEGIN_EXTERN_C()
ZEND_API void zend_bailout();
END_EXTERN_C()
ZEND_API char *get_zend_version();
ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_copy);
ZEND_API int zend_print_zval(zval *expr, int indent);
ZEND_API void zend_print_zval_r(zval *expr, int indent);
@@ -172,18 +203,21 @@ ZEND_API extern char *undefined_variable_string;
#define ZEND_PUTS(str) zend_write((str), strlen((str)))
#define ZEND_PUTC(c) zend_write(&(c), 1), (c)
BEGIN_EXTERN_C()
extern ZEND_API int (*zend_printf)(const char *format, ...);
extern ZEND_API int (*zend_write)(const char *str, uint str_length);
extern ZEND_API void (*zend_error)(int type, const char *format, ...);
extern FILE *(*zend_fopen)(const char *filename);
extern void (*zend_message_dispatcher)(long message, void *data);
extern void (*zend_block_interruptions)();
extern void (*zend_unblock_interruptions)();
extern void (*zend_message_dispatcher)(long message, void *data);
extern ZEND_API int (*zend_get_ini_entry)(char *name, uint name_length, zval *contents);
END_EXTERN_C()
void zenderror(char *error);
extern zend_class_entry standard_class;
extern ZEND_API zend_class_entry zend_standard_class_def;
extern zend_utility_values zend_uv;
#define ZEND_UV(name) (zend_uv.name)
@@ -193,13 +227,22 @@ extern zend_utility_values zend_uv;
#define HANDLE_UNBLOCK_INTERRUPTIONS() if (zend_unblock_interruptions) { zend_unblock_interruptions(); }
/* Messages for applications of Zend */
#define ZMSG_ENABLE_TRACK_VARS 1L
#define ZMSG_FAILED_INCLUDE_FOPEN 2L
#define ZMSG_FAILED_REQUIRE_FOPEN 3L
#define ZMSG_FAILED_HIGHLIGHT_FOPEN 4L
#define ZMSG_MEMORY_LEAK_DETECTED 5L
#define ZMSG_MEMORY_LEAK_REPEATED 6L
#define ZMSG_LOG_SCRIPT_NAME 7L
#define INIT_PZVAL(z) \
(z)->refcount = 1; \
(z)->EA.is_ref = 0; \
(z)->EA.locks = 0;
#define MAKE_STD_ZVAL(zv) \
zv = (zval *) emalloc(sizeof(zval)); \
INIT_PZVAL(zv);
#endif /* _ZEND_H */
+212 -142
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include "zend.h"
#include "zend_variables.h"
#include "zend_execute.h"
@@ -31,89 +35,149 @@ static int module_count=0;
HashTable list_destructors, module_registry;
/* this function doesn't check for too many parameters */
int getParameters(HashTable *ht, int param_count,...)
ZEND_API int getParameters(int ht, int param_count,...)
{
void **p;
int arg_count;
va_list ptr;
zval **param, **tmp = NULL, *param_ptr;
int i;
zval **param, *param_ptr;
ELS_FETCH();
ALS_FETCH();
va_start(ptr, param_count);
p = EG(argument_stack).top_element-1;
arg_count = (ulong) *p;
for (i = 0; i < param_count; i++) {
param = va_arg(ptr, zval **);
if (zend_hash_index_find(ht, i, (void **) &tmp) == FAILURE) {
va_end(ptr);
return FAILURE;
}
param_ptr = *tmp;
if (!param_ptr->is_ref && param_ptr->refcount>1) {
zval *new_tmp;
new_tmp = (zval *) emalloc(sizeof(zval));
*new_tmp = *param_ptr;
zval_copy_ctor(new_tmp);
new_tmp->refcount = 1;
new_tmp->is_ref = 0;
param_ptr = new_tmp;
zend_hash_index_update(ht, i, &param_ptr, sizeof(zval *), NULL);
}
*param = param_ptr;
}
va_end(ptr);
return SUCCESS;
}
int getParametersArray(HashTable *ht, int param_count, zval **argument_array)
{
int i;
zval **tmp = NULL, *param_ptr;
for (i = 0; i < param_count; i++) {
if (zend_hash_index_find(ht, i, (void **) &tmp) == FAILURE) {
return FAILURE;
}
param_ptr = *tmp;
if (!param_ptr->is_ref && param_ptr->refcount>1) {
zval *new_tmp;
new_tmp = (zval *) emalloc(sizeof(zval));
*new_tmp = *param_ptr;
zval_copy_ctor(new_tmp);
new_tmp->refcount = 1;
new_tmp->is_ref = 0;
param_ptr = new_tmp;
zend_hash_index_update(ht, i, &param_ptr, sizeof(zval *), NULL);
}
argument_array[i] = param_ptr;
}
return SUCCESS;
}
int getThis(zval **this)
{
/* NEEDS TO BE IMPLEMENTED FOR ZEND */
/*
zval *data;
if (zend_hash_find(GLOBAL(function_state.calling_symbol_table), "this", sizeof("this"), (void **)&data) == FAILURE) {
if (param_count>arg_count) {
return FAILURE;
}
*this = data;
*/
va_start(ptr, param_count);
while (param_count>0) {
param = va_arg(ptr, zval **);
param_ptr = *(p-param_count);
if (!PZVAL_IS_REF(param_ptr) && param_ptr->refcount>1) {
zval *new_tmp;
new_tmp = (zval *) emalloc(sizeof(zval));
*new_tmp = *param_ptr;
zval_copy_ctor(new_tmp);
INIT_PZVAL(new_tmp);
param_ptr = new_tmp;
((zval *) *(p-param_count))->refcount--;
*(p-param_count) = param_ptr;
}
*param = param_ptr;
param_count--;
}
va_end(ptr);
return SUCCESS;
}
int ParameterPassedByReference(HashTable *ht, uint n)
{
zval **tmp;
if (zend_hash_index_find(ht, n-1, (void **) &tmp) == FAILURE) {
return 0;
ZEND_API int getParametersArray(int ht, int param_count, zval **argument_array)
{
void **p;
int arg_count;
zval *param_ptr;
ELS_FETCH();
p = EG(argument_stack).top_element-1;
arg_count = (ulong) *p;
if (param_count>arg_count) {
return FAILURE;
}
return (*tmp)->is_ref;
while (param_count>0) {
param_ptr = *(p-param_count);
if (!PZVAL_IS_REF(param_ptr) && param_ptr->refcount>1) {
zval *new_tmp;
new_tmp = (zval *) emalloc(sizeof(zval));
*new_tmp = *param_ptr;
zval_copy_ctor(new_tmp);
INIT_PZVAL(new_tmp);
param_ptr = new_tmp;
((zval *) *(p-param_count))->refcount--;
*(p-param_count) = param_ptr;
}
*(argument_array++) = param_ptr;
param_count--;
}
return SUCCESS;
}
/* Zend-optimized Extended functions */
/* this function doesn't check for too many parameters */
ZEND_API int getParametersEx(int param_count,...)
{
void **p;
int arg_count;
va_list ptr;
zval ***param;
ELS_FETCH();
p = EG(argument_stack).top_element-1;
arg_count = (ulong) *p;
if (param_count>arg_count) {
return FAILURE;
}
va_start(ptr, param_count);
while (param_count>0) {
param = va_arg(ptr, zval ***);
*param = (zval **) p-(param_count--);
}
va_end(ptr);
return SUCCESS;
}
ZEND_API int getParametersArrayEx(int param_count, zval ***argument_array)
{
void **p;
int arg_count;
ELS_FETCH();
p = EG(argument_stack).top_element-1;
arg_count = (ulong) *p;
if (param_count>arg_count) {
return FAILURE;
}
while (param_count>0) {
*(argument_array++) = (zval **) p-(param_count--);
}
return SUCCESS;
}
ZEND_API int ParameterPassedByReference(int ht, uint n)
{
void **p;
ulong arg_count;
zval *arg;
ELS_FETCH();
p = EG(argument_stack).elements+EG(argument_stack).top-1;
arg_count = (ulong) *p;
if (n>arg_count) {
return FAILURE;
}
arg = (zval *) *(p-arg_count+n-1);
return PZVAL_IS_REF(arg);
}
@@ -158,7 +222,7 @@ ZEND_API inline int object_init_ex(zval *arg, zend_class_entry *class_type)
ZEND_API inline int object_init(zval *arg)
{
return object_init_ex(arg, &standard_class);
return object_init_ex(arg, &zend_standard_class_def);
}
@@ -168,8 +232,7 @@ ZEND_API inline int add_assoc_long(zval *arg, char *key, long n)
tmp->type = IS_LONG;
tmp->value.lval = n;
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_update(arg->value.ht, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL);
}
@@ -180,8 +243,7 @@ ZEND_API inline int add_assoc_double(zval *arg, char *key, double d)
tmp->type = IS_DOUBLE;
tmp->value.dval = d;
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_update(arg->value.ht, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL);
}
@@ -197,8 +259,7 @@ ZEND_API inline int add_assoc_string(zval *arg, char *key, char *str, int duplic
} else {
tmp->value.str.val = str;
}
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_update(arg->value.ht, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL);
}
@@ -214,8 +275,7 @@ ZEND_API inline int add_assoc_stringl(zval *arg, char *key, char *str, uint leng
} else {
tmp->value.str.val = str;
}
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_update(arg->value.ht, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL);
}
@@ -233,8 +293,7 @@ ZEND_API inline int add_index_long(zval *arg, uint index, long n)
tmp->type = IS_LONG;
tmp->value.lval = n;
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),NULL);
}
@@ -245,8 +304,7 @@ ZEND_API inline int add_index_double(zval *arg, uint index, double d)
tmp->type = IS_DOUBLE;
tmp->value.dval = d;
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),NULL);
}
@@ -262,9 +320,8 @@ ZEND_API inline int add_index_string(zval *arg, uint index, char *str, int dupli
} else {
tmp->value.str.val = str;
}
tmp->refcount=1;
tmp->is_ref=0;
return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),NULL);
INIT_PZVAL(tmp);
return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *), NULL);
}
@@ -279,8 +336,7 @@ ZEND_API inline int add_index_stringl(zval *arg, uint index, char *str, uint len
} else {
tmp->value.str.val = str;
}
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),NULL);
}
@@ -291,8 +347,7 @@ ZEND_API inline int add_next_index_long(zval *arg, long n)
tmp->type = IS_LONG;
tmp->value.lval = n;
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_next_index_insert(arg->value.ht, &tmp, sizeof(zval *), NULL);
}
@@ -303,8 +358,7 @@ ZEND_API inline int add_next_index_double(zval *arg, double d)
tmp->type = IS_DOUBLE;
tmp->value.dval = d;
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_next_index_insert(arg->value.ht, &tmp, sizeof(zval *), NULL);
}
@@ -320,8 +374,7 @@ ZEND_API inline int add_next_index_string(zval *arg, char *str, int duplicate)
} else {
tmp->value.str.val = str;
}
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_next_index_insert(arg->value.ht, &tmp, sizeof(zval *),NULL);
}
@@ -337,8 +390,7 @@ ZEND_API inline int add_next_index_stringl(zval *arg, char *str, uint length, in
} else {
tmp->value.str.val = str;
}
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_next_index_insert(arg->value.ht, &tmp, sizeof(zval *),NULL);
}
@@ -354,8 +406,7 @@ ZEND_API inline int add_get_assoc_string(zval *arg, char *key, char *str, void *
} else {
tmp->value.str.val = str;
}
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_update(arg->value.ht, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), dest);
}
@@ -371,8 +422,7 @@ ZEND_API inline int add_get_assoc_stringl(zval *arg, char *key, char *str, uint
} else {
tmp->value.str.val = str;
}
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_update(arg->value.ht, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), dest);
}
@@ -382,9 +432,8 @@ ZEND_API inline int add_get_index_long(zval *arg, uint index, long l, void **des
zval *tmp = (zval *) emalloc(sizeof(zval));
tmp->type = IS_LONG;
tmp->value.lval= l;
tmp->refcount=1;
tmp->is_ref=0;
tmp->value.lval = l;
INIT_PZVAL(tmp);
return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),dest);
}
@@ -395,8 +444,7 @@ ZEND_API inline int add_get_index_double(zval *arg, uint index, double d, void *
tmp->type = IS_DOUBLE;
tmp->value.dval= d;
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),dest);
}
@@ -412,8 +460,7 @@ ZEND_API inline int add_get_index_string(zval *arg, uint index, char *str, void
} else {
tmp->value.str.val = str;
}
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),dest);
}
@@ -429,8 +476,7 @@ ZEND_API inline int add_get_index_stringl(zval *arg, uint index, char *str, uint
} else {
tmp->value.str.val = str;
}
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_index_update(arg->value.ht, index, (void *) &tmp, sizeof(zval *),dest);
}
@@ -441,8 +487,7 @@ ZEND_API inline int add_property_long(zval *arg, char *key, long n)
tmp->type = IS_LONG;
tmp->value.lval = n;
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_update(arg->value.obj.properties, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL);
}
@@ -453,8 +498,7 @@ ZEND_API inline int add_property_double(zval *arg, char *key, double d)
tmp->type = IS_DOUBLE;
tmp->value.dval = d;
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_update(arg->value.obj.properties, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL);
}
@@ -470,8 +514,7 @@ ZEND_API inline int add_property_string(zval *arg, char *key, char *str, int dup
} else {
tmp->value.str.val = str;
}
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_update(arg->value.obj.properties, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL);
}
@@ -487,8 +530,7 @@ ZEND_API inline int add_property_stringl(zval *arg, char *key, char *str, uint l
} else {
tmp->value.str.val = str;
}
tmp->refcount=1;
tmp->is_ref=0;
INIT_PZVAL(tmp);
return zend_hash_update(arg->value.obj.properties, key, strlen(key)+1, (void *) &tmp, sizeof(zval *), NULL);
}
@@ -504,7 +546,7 @@ int zend_startup_module(zend_module_entry *module)
}
}
module->type = MODULE_PERSISTENT;
register_module(module);
zend_register_module(module);
}
return SUCCESS;
}
@@ -531,13 +573,17 @@ ZEND_API int _register_list_destructors(void (*list_destructor)(void *), void (*
/* registers all functions in *library_functions in the function hash */
int register_functions(function_entry *functions)
int zend_register_functions(zend_function_entry *functions, HashTable *function_table)
{
function_entry *ptr = functions;
zend_function_entry *ptr = functions;
zend_internal_function internal_function;
int count=0,unload=0;
HashTable *target_function_table = function_table;
CLS_FETCH();
if (!target_function_table) {
target_function_table = CG(function_table);
}
internal_function.type = ZEND_INTERNAL_FUNCTION;
while (ptr->fname) {
@@ -546,10 +592,10 @@ int register_functions(function_entry *functions)
internal_function.function_name = ptr->fname;
if (!internal_function.handler) {
zend_error(E_CORE_WARNING,"Null function defined as active function");
unregister_functions(functions,count);
zend_unregister_functions(functions, count, target_function_table);
return FAILURE;
}
if (zend_hash_add(CG(function_table), ptr->fname, strlen(ptr->fname)+1, &internal_function, sizeof(zend_internal_function), NULL) == FAILURE) {
if (zend_hash_add(target_function_table, ptr->fname, strlen(ptr->fname)+1, &internal_function, sizeof(zend_internal_function), NULL) == FAILURE) {
unload=1;
break;
}
@@ -558,12 +604,12 @@ int register_functions(function_entry *functions)
}
if (unload) { /* before unloading, display all remaining bad function in the module */
while (ptr->fname) {
if (zend_hash_exists(CG(function_table), ptr->fname, strlen(ptr->fname)+1)) {
zend_error(E_CORE_WARNING,"Module load failed - duplicate function name - %s",ptr->fname);
if (zend_hash_exists(target_function_table, ptr->fname, strlen(ptr->fname)+1)) {
zend_error(E_CORE_WARNING, "Function registration failed - duplicate name - %s",ptr->fname);
}
ptr++;
}
unregister_functions(functions,count);
zend_unregister_functions(functions, count, target_function_table);
return FAILURE;
}
return SUCCESS;
@@ -572,32 +618,36 @@ int register_functions(function_entry *functions)
/* count=-1 means erase all functions, otherwise,
* erase the first count functions
*/
void unregister_functions(function_entry *functions,int count)
void zend_unregister_functions(zend_function_entry *functions, int count, HashTable *function_table)
{
function_entry *ptr = functions;
zend_function_entry *ptr = functions;
int i=0;
HashTable *target_function_table = function_table;
CLS_FETCH();
if (!target_function_table) {
target_function_table = CG(function_table);
}
while (ptr->fname) {
if (count!=-1 && i>=count) {
break;
}
#if 0
zend_printf("Unregistering %s()\n",ptr->fname);
zend_printf("Unregistering %s()\n", ptr->fname);
#endif
zend_hash_del(CG(function_table),ptr->fname,strlen(ptr->fname)+1);
zend_hash_del(target_function_table, ptr->fname, strlen(ptr->fname)+1);
ptr++;
i++;
}
}
int register_module(zend_module_entry *module)
ZEND_API int zend_register_module(zend_module_entry *module)
{
#if 0
zend_printf("%s: Registering module %d\n",module->name, module->module_number);
#endif
if (register_functions(module->functions)==FAILURE) {
if (module->functions && zend_register_functions(module->functions, NULL)==FAILURE) {
zend_error(E_CORE_WARNING,"%s: Unable to register functions, unable to load",module->name);
return FAILURE;
}
@@ -617,17 +667,19 @@ void module_destructor(zend_module_entry *module)
#if 0
zend_printf("%s: Request shutdown\n",module->name);
#endif
module->request_shutdown_func();
module->request_shutdown_func(module->type, module->module_number);
}
module->request_started=0;
if (module->module_started && module->module_shutdown_func) {
#if 0
zend_printf("%s: Module shutdown\n",module->name);
#endif
module->module_shutdown_func();
module->module_shutdown_func(module->type, module->module_number);
}
module->module_started=0;
unregister_functions(module->functions,-1);
if (module->functions) {
zend_unregister_functions(module->functions, -1, NULL);
}
#if HAVE_LIBDL
if (module->handle) {
@@ -662,7 +714,7 @@ int module_registry_cleanup(zend_module_entry *module)
#if 0
zend_printf("%s: Request shutdown\n",module->name);
#endif
module->request_shutdown_func();
module->request_shutdown_func(module->type, module->module_number);
}
module->request_started=0;
return 0;
@@ -682,7 +734,7 @@ int zend_next_free_module(void)
}
zend_class_entry *register_internal_class(zend_class_entry *class_entry)
ZEND_API zend_class_entry *register_internal_class(zend_class_entry *class_entry)
{
zend_class_entry *register_class;
char *lowercase_name = zend_strndup(class_entry->name, class_entry->name_length);
@@ -692,10 +744,28 @@ zend_class_entry *register_internal_class(zend_class_entry *class_entry)
class_entry->type = ZEND_INTERNAL_CLASS;
class_entry->parent = NULL;
class_entry->refcount = (int *) malloc(sizeof(int));
*class_entry->refcount = 1;
zend_hash_init(&class_entry->default_properties, 0, NULL, PVAL_PTR_DTOR, 1);
zend_hash_init(&class_entry->function_table, 0, NULL, (void (*)(void *)) destroy_zend_function, 1);
zend_hash_init(&class_entry->function_table, 0, NULL, ZEND_FUNCTION_DTOR, 1);
zend_hash_update(CG(class_table), lowercase_name, class_entry->name_length+1, class_entry, sizeof(zend_class_entry), (void **) &register_class);
free(lowercase_name);
if (class_entry->builtin_functions) {
zend_register_functions(class_entry->builtin_functions, &class_entry->function_table);
}
return register_class;
}
ZEND_API zend_module_entry *zend_get_module(int module_number)
{
zend_module_entry *module;
if (zend_hash_index_find(&module_registry, module_number, (void **) &module)==SUCCESS) {
return module;
} else {
return NULL;
}
}
+160 -14
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _ZEND_API_H
#define _ZEND_API_H
@@ -21,28 +25,63 @@
#include "zend_list.h"
#define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)
#define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(zend_if_##name)
#define ZEND_NAMED_FE(runtime_name, name, arg_types) { #runtime_name, name, arg_types },
#define ZEND_FE(name, arg_types) ZEND_NAMED_FE(name, zend_if_##name, arg_types)
#define INIT_CLASS_ENTRY(class_container, class_name, functions) \
{ \
class_container.name = strdup(class_name); \
class_container.name_length = sizeof(class_name)-1; \
class_container.builtin_functions = functions; \
class_container.handle_function_call = NULL; \
class_container.handle_property_get = NULL; \
class_container.handle_property_set = NULL; \
}
#define INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, handle_fcall, handle_propget, handle_propset) \
{ \
class_container.name = strdup(class_name); \
class_container.name_length = sizeof(class_name)-1; \
class_container.builtin_functions = functions; \
class_container.handle_function_call = handle_fcall; \
class_container.handle_property_get = handle_propget; \
class_container.handle_property_set = handle_propset; \
}
int zend_next_free_module(void);
int getParameters(HashTable *ht, int param_count,...);
int getParametersArray(HashTable *ht, int param_count, zval **argument_array);
int getThis(zval **this);
int ParameterPassedByReference(HashTable *ht, uint n);
int register_functions(function_entry *functions);
void unregister_functions(function_entry *functions, int count);
int register_module(zend_module_entry *module_entry);
zend_class_entry *register_internal_class(zend_class_entry *class_entry);
ZEND_API int getParameters(int ht, int param_count,...);
ZEND_API int getParametersArray(int ht, int param_count, zval **argument_array);
ZEND_API int getParametersEx(int param_count,...);
ZEND_API int getParametersArrayEx(int param_count, zval ***argument_array);
ZEND_API int ParameterPassedByReference(int ht, uint n);
int zend_register_functions(zend_function_entry *functions, HashTable *function_table);
void zend_unregister_functions(zend_function_entry *functions, int count, HashTable *function_table);
ZEND_API int zend_register_module(zend_module_entry *module_entry);
ZEND_API zend_class_entry *register_internal_class(zend_class_entry *class_entry);
ZEND_API zend_module_entry *zend_get_module(int module_number);
ZEND_API void wrong_param_count(void);
#define getThis() (this_ptr)
#define WRONG_PARAM_COUNT { wrong_param_count(); return; }
#define WRONG_PARAM_COUNT_WITH_RETVAL(ret) { wrong_param_count(); return ret; }
#define ARG_COUNT(ht) (ht->nNextFreeElement)
#define ARG_COUNT(ht) (ht)
#define BYREF_NONE 0
#define BYREF_FORCE 1
#define BYREF_ALLOW 2
#if !MSVC5
#if !(WIN32||WINNT)
#define DLEXPORT
#endif
@@ -82,6 +121,113 @@ ZEND_API int add_property_stringl(zval *arg, char *key, char *str, uint length,
#define add_method(arg,key,method) add_assoc_function((arg),(key),(method))
#define RETVAL_RESOURCE(l) { \
return_value->type = IS_RESOURCE;\
return_value->value.lval = l; \
}
#define RETVAL_LONG(l) { \
return_value->type = IS_LONG; \
return_value->value.lval = l; \
}
#define RETVAL_DOUBLE(d) { \
return_value->type = IS_DOUBLE; \
return_value->value.dval = d; \
}
#define RETVAL_STRING(s,duplicate) { \
char *__s=(s); \
return_value->value.str.len = strlen(__s); \
return_value->value.str.val = (duplicate?estrndup(__s,return_value->value.str.len):__s); \
return_value->type = IS_STRING; \
}
#define RETVAL_STRINGL(s,l,duplicate) { \
char *__s=(s); int __l=l; \
return_value->value.str.len = __l; \
return_value->value.str.val = (duplicate?estrndup(__s,__l):__s); \
return_value->type = IS_STRING; \
}
#define RETVAL_FALSE { return_value->value.lval = 0; return_value->type = IS_BOOL; }
#define RETVAL_TRUE { return_value->value.lval = 1; return_value->type = IS_BOOL; }
#define RETURN_RESOURCE(l) { \
return_value->type = IS_RESOURCE;\
return_value->value.lval = l; \
return; \
}
#define RETURN_LONG(l) { \
return_value->type = IS_LONG; \
return_value->value.lval = l; \
return; \
}
#define RETURN_DOUBLE(d) { \
return_value->type = IS_DOUBLE; \
return_value->value.dval = d; \
return; \
}
#define RETURN_STRING(s,duplicate) { \
char *__s=(s); \
return_value->value.str.len = strlen(__s); \
return_value->value.str.val = (duplicate?estrndup(__s,return_value->value.str.len):__s); \
return_value->type = IS_STRING; \
return; \
}
#define RETURN_STRINGL(s,l,duplicate) { \
char *__s=(s); int __l=l; \
return_value->value.str.len = __l; \
return_value->value.str.val = (duplicate?estrndup(__s,__l):__s); \
return_value->type = IS_STRING; \
return; \
}
#define RETURN_FALSE { RETVAL_FALSE; return; }
#define RETURN_TRUE { RETVAL_TRUE; return; }
#define SET_VAR_STRING(n,v) { \
{ \
zval *var = (zval *) emalloc(sizeof(zval)); \
\
char *str=v; /* prevent 'v' from being evaluated more than once */ \
var->value.str.val = (str); \
var->value.str.len = strlen((str)); \
var->type = IS_STRING; \
INIT_PZVAL(var); \
zend_hash_update(&EG(symbol_table), (n), strlen((n))+1, &var, sizeof(zval *), NULL); \
} \
}
#define SET_VAR_STRINGL(n,v,l) { \
{ \
zval *var = (zval *) emalloc(sizeof(zval)); \
\
char *name=(n); \
var->value.str.val = (v); \
var->value.str.len = (l); \
var->type = IS_STRING; \
INIT_PZVAL(var); \
zend_hash_update(&EG(symbol_table), name, strlen(name)+1, &var, sizeof(zval *), NULL); \
} \
}
#define SET_VAR_LONG(n,v) { \
{ \
zval *var = (zval *) emalloc(sizeof(zval)); \
\
var->value.lval = (v); \
var->type = IS_LONG; \
INIT_PZVAL(var); \
zend_hash_update(&EG(symbol_table), (n), strlen((n))+1, &var, sizeof(zval *), NULL); \
} \
}
#define SET_VAR_DOUBLE(n,v) { \
{ \
zval *var = (zval *) emalloc(sizeof(zval)); \
\
var->value.dval = (v); \
var->type = IS_DOUBLE; \
INIT_PZVAL(var); \
zend_hash_update(&EG(symbol_table)), (n), strlen((n))+1, &var, sizeof(zval *), NULL); \
} \
}
#endif /* _ZEND_API_H */
/*
+132 -38
View File
@@ -4,21 +4,31 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include <stdlib.h>
#include "zend.h"
#include "zend_alloc.h"
#include "zend_globals.h"
#if HAVE_SIGNAL_H
#include <signal.h>
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifndef ZTS
static zend_alloc_globals alloc_globals;
@@ -42,11 +52,11 @@ static zend_alloc_globals alloc_globals;
# endif
#define _CHECK_MEMORY_LIMIT(s,file,lineno) { AG(allocated_memory) += (s);\
if (php3_ini.memory_limit<AG(allocated_memory)) {\
if (AG(memory_limit)<AG(allocated_memory)) {\
if (!file) { \
zend_error(E_ERROR,"Allowed memory size of %d bytes exhausted (tried to allocate %d bytes)",php3_ini.memory_limit,s); \
zend_error(E_ERROR,"Allowed memory size of %d bytes exhausted (tried to allocate %d bytes)", AG(memory_limit),s); \
} else { \
zend_error(E_ERROR,"Allowed memory size of %d bytes exhausted at %s:%d (tried to allocate %d bytes)",php3_ini.memory_limit,file,lineno,s); \
zend_error(E_ERROR,"Allowed memory size of %d bytes exhausted at %s:%d (tried to allocate %d bytes)", AG(memory_limit), file, lineno, s); \
} \
} \
}
@@ -86,7 +96,6 @@ static zend_alloc_globals alloc_globals;
p->pLast = (mem_header *) NULL;
/* used by ISAPI and NSAPI */
#if ZEND_DEBUG
ZEND_API void *_emalloc(size_t size, char *filename, uint lineno)
@@ -95,6 +104,7 @@ ZEND_API void *_emalloc(size_t size)
#endif
{
mem_header *p;
ALS_FETCH();
HANDLE_BLOCK_INTERRUPTIONS();
@@ -104,6 +114,7 @@ ZEND_API void *_emalloc(size_t size)
p->filename = filename;
p->lineno = lineno;
p->magic = MEM_BLOCK_START_MAGIC;
p->reported = 0;
#endif
HANDLE_UNBLOCK_INTERRUPTIONS();
p->persistent = 0;
@@ -114,8 +125,12 @@ ZEND_API void *_emalloc(size_t size)
}
if (!p) {
fprintf(stderr,"FATAL: emalloc(): Unable to allocate %d bytes\n", size);
fprintf(stderr,"FATAL: emalloc(): Unable to allocate %ld bytes\n", (long) size);
#if ZEND_DEBUG && HAVE_KILL && HAVE_GETPID
kill(getpid(), SIGSEGV);
#else
exit(1);
#endif
HANDLE_UNBLOCK_INTERRUPTIONS();
return (void *)p;
}
@@ -126,6 +141,7 @@ ZEND_API void *_emalloc(size_t size)
p->filename = filename;
p->lineno = lineno;
p->magic = MEM_BLOCK_START_MAGIC;
p->reported = 0;
*((long *)(((char *) p) + sizeof(mem_header)+size+PLATFORM_PADDING+END_ALIGNMENT(size))) = MEM_BLOCK_END_MAGIC;
#endif
#if MEMORY_LIMIT
@@ -143,9 +159,12 @@ ZEND_API void _efree(void *ptr)
#endif
{
mem_header *p = (mem_header *) ((char *)ptr - sizeof(mem_header) - PLATFORM_PADDING);
ALS_FETCH();
#if ZEND_DEBUG
_mem_block_check(ptr, 1, filename, lineno);
if (!_mem_block_check(ptr, 1, filename, lineno)) {
return;
}
memset(ptr, 0x5a, p->size);
#endif
@@ -195,13 +214,14 @@ ZEND_API void *_ecalloc(size_t nmemb, size_t size)
#if ZEND_DEBUG
ZEND_API void *_erealloc(void *ptr, size_t size, char *filename, uint lineno)
ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure, char *filename, uint lineno)
#else
ZEND_API void *_erealloc(void *ptr, size_t size)
ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure)
#endif
{
mem_header *p = (mem_header *) ((char *)ptr-sizeof(mem_header)-PLATFORM_PADDING);
mem_header *orig = p;
ALS_FETCH();
if (!ptr) {
#if ZEND_DEBUG
@@ -214,10 +234,16 @@ ZEND_API void *_erealloc(void *ptr, size_t size)
REMOVE_POINTER_FROM_LIST(p);
p = (mem_header *) realloc(p,sizeof(mem_header)+size+PLATFORM_PADDING+END_ALIGNMENT(size)+END_MAGIC_SIZE);
if (!p) {
fprintf(stderr,"FATAL: erealloc(): Unable to allocate %d bytes\n", size);
HANDLE_UNBLOCK_INTERRUPTIONS();
zend_bailout();
if (!allow_failure) {
fprintf(stderr,"FATAL: erealloc(): Unable to allocate %ld bytes\n", (long) size);
#if ZEND_DEBUG && HAVE_KILL && HAVE_GETPID
kill(getpid(), SIGSEGV);
#else
exit(1);
#endif
}
ADD_POINTER_TO_LIST(orig);
HANDLE_UNBLOCK_INTERRUPTIONS();
return (void *)NULL;
}
ADD_POINTER_TO_LIST(p);
@@ -304,11 +330,27 @@ ZEND_API char *zend_strndup(const char *s, uint length)
}
ZEND_API int zend_set_memory_limit(unsigned int memory_limit)
{
#if MEMORY_LIMIT
ALS_FETCH();
AG(memory_limit) = memory_limit;
return SUCCESS;
#else
return FAILURE;
#endif
}
ZEND_API void start_memory_manager(void)
{
ALS_FETCH();
AG(phead) = AG(head) = NULL;
#if MEMORY_LIMIT
AG(memory_limit)=1<<30; /* rediculous limit, effectively no limit */
AG(allocated_memory)=0;
AG(memory_exhausted)=0;
#endif
@@ -320,17 +362,37 @@ ZEND_API void start_memory_manager(void)
ZEND_API void shutdown_memory_manager(int silent, int clean_cache)
{
mem_header *p, *t;
#ifdef ZEND_DEBUG
int had_leaks=0;
#endif
ALS_FETCH();
p=AG(head);
t=AG(head);
while (t) {
if (!t->cached || clean_cache) {
#if ZEND_DEBUG
if (!t->cached) {
/* does not use zend_error() *intentionally* */
if (!t->cached && !t->reported) {
mem_header *iterator;
int total_leak=0, total_leak_count=0;
had_leaks=1;
if (!silent) {
zend_message_dispatcher(ZMSG_MEMORY_LEAK_DETECTED, t);
}
t->reported = 1;
for (iterator=t->pNext; iterator; iterator=iterator->pNext) {
if (!iterator->cached
&& iterator->filename==t->filename
&& iterator->lineno==t->lineno) {
total_leak += iterator->size;
total_leak_count++;
iterator->reported = 1;
}
}
if (!silent && total_leak_count>0) {
zend_message_dispatcher(ZMSG_MEMORY_LEAK_REPEATED, (void *) (long) (total_leak_count));
}
}
#endif
p = t->pNext;
@@ -345,6 +407,23 @@ ZEND_API void shutdown_memory_manager(int silent, int clean_cache)
#if ZEND_DEBUG
void zend_debug_alloc_output(char *format, ...)
{
char output_buf[256];
va_list args;
va_start(args, format);
vsprintf(output_buf, format, args);
va_end(args);
#if WIN32||WINNT
OutputDebugString(output_buf);
#else
fprintf(stderr, output_buf);
#endif
}
ZEND_API int _mem_block_check(void *ptr, int silent, char *filename, int lineno)
{
mem_header *p = (mem_header *) ((char *)ptr - sizeof(mem_header) - PLATFORM_PADDING);
@@ -361,20 +440,21 @@ ZEND_API int _mem_block_check(void *ptr, int silent, char *filename, int lineno)
no_cache_notice=1;
}
if (!silent) {
fprintf(stderr,"---------------------------------------\n");
fprintf(stderr,"Block 0x%0.8lX status at %s:%d:\n", (long) p, filename, lineno);
fprintf(stderr,"%10s\t","Beginning: ");
zend_message_dispatcher(ZMSG_LOG_SCRIPT_NAME, NULL);
zend_debug_alloc_output("---------------------------------------\n");
zend_debug_alloc_output("%s(%d) : Block 0x%0.8lX status:\n", filename, lineno, (long) p);
zend_debug_alloc_output("%10s\t","Beginning: ");
}
switch (p->magic) {
case MEM_BLOCK_START_MAGIC:
if (!silent) {
fprintf(stderr, "OK (allocated on %s:%d, %d bytes)\n", p->filename, p->lineno, p->size);
zend_debug_alloc_output("OK (allocated on %s:%d, %d bytes)\n", p->filename, p->lineno, p->size);
}
break; /* ok */
case MEM_BLOCK_FREED_MAGIC:
if (!silent) {
fprintf(stderr,"Freed\n");
zend_debug_alloc_output("Freed\n");
had_problems=1;
} else {
return _mem_block_check(ptr, 0, filename, lineno);
@@ -383,7 +463,7 @@ ZEND_API int _mem_block_check(void *ptr, int silent, char *filename, int lineno)
case MEM_BLOCK_CACHED_MAGIC:
if (!silent) {
if (!no_cache_notice) {
fprintf(stderr,"Cached (allocated on %s:%d, %d bytes)\n", p->filename, p->lineno, p->size);
zend_debug_alloc_output("Cached (allocated on %s:%d, %d bytes)\n", p->filename, p->lineno, p->size);
had_problems=1;
}
} else {
@@ -394,7 +474,7 @@ ZEND_API int _mem_block_check(void *ptr, int silent, char *filename, int lineno)
break;
default:
if (!silent) {
fprintf(stderr,"Overrun (magic=0x%0.8lX, expected=0x%0.8lX)\n", p->magic, MEM_BLOCK_START_MAGIC);
zend_debug_alloc_output("Overrun (magic=0x%0.8lX, expected=0x%0.8lX)\n", p->magic, MEM_BLOCK_START_MAGIC);
} else {
return _mem_block_check(ptr, 0, filename, lineno);
}
@@ -423,26 +503,32 @@ ZEND_API int _mem_block_check(void *ptr, int silent, char *filename, int lineno)
}
}
fprintf(stderr,"%10s\t", "End:");
fprintf(stderr,"Overflown (magic=0x%0.8lX instead of 0x%0.8lX)\n",
zend_debug_alloc_output("%10s\t", "End:");
zend_debug_alloc_output("Overflown (magic=0x%0.8lX instead of 0x%0.8lX)\n",
*((long *)(((char *) p) + sizeof(mem_header)+p->size+PLATFORM_PADDING+END_ALIGNMENT(p->size))), MEM_BLOCK_END_MAGIC);
fprintf(stderr,"%10s\t","");
zend_debug_alloc_output("%10s\t","");
if (overflows>=sizeof(long)) {
fprintf(stderr, "At least %d bytes overflown\n", sizeof(long));
zend_debug_alloc_output("At least %d bytes overflown\n", sizeof(long));
} else {
fprintf(stderr, "%d byte(s) overflown\n", overflows);
zend_debug_alloc_output("%d byte(s) overflown\n", overflows);
}
} else if (!silent) {
fprintf(stderr,"%10s\t", "End:");
zend_debug_alloc_output("%10s\t", "End:");
if (valid_beginning) {
fprintf(stderr,"OK\n");
zend_debug_alloc_output("OK\n");
} else {
fprintf(stderr,"Unknown\n");
zend_debug_alloc_output("Unknown\n");
}
}
if (had_problems) {
int foo = 5;
foo+=1;
}
if (!silent) {
fprintf(stderr,"---------------------------------------\n");
zend_debug_alloc_output("---------------------------------------\n");
}
return ((!had_problems) ? 1 : 0);
}
@@ -450,11 +536,15 @@ ZEND_API int _mem_block_check(void *ptr, int silent, char *filename, int lineno)
ZEND_API void _full_mem_check(int silent, char *filename, uint lineno)
{
mem_header *p = AG(head);
mem_header *p;
int errors=0;
ALS_FETCH();
fprintf(stderr,"------------------------------------------------\n");
fprintf(stderr,"Full Memory Check at %s:%d\n", filename, lineno);
p = AG(head);
zend_debug_alloc_output("------------------------------------------------\n");
zend_debug_alloc_output("Full Memory Check at %s:%d\n", filename, lineno);
while (p) {
if (!_mem_block_check((void *)((char *)p + sizeof(mem_header) + PLATFORM_PADDING), (silent?2:3), filename, lineno)) {
@@ -462,8 +552,8 @@ ZEND_API void _full_mem_check(int silent, char *filename, uint lineno)
}
p = p->pNext;
}
fprintf(stderr,"End of full memory check %s:%d (%d errors)\n", filename, lineno, errors);
fprintf(stderr,"------------------------------------------------\n");
zend_debug_alloc_output("End of full memory check %s:%d (%d errors)\n", filename, lineno, errors);
zend_debug_alloc_output("------------------------------------------------\n");
}
#endif
@@ -475,11 +565,14 @@ ZEND_API void _persist_alloc(void *ptr)
#endif
{
mem_header *p = (mem_header *) ((char *)ptr-sizeof(mem_header)-PLATFORM_PADDING);
ALS_FETCH();
#if ZEND_DEBUG
_mem_block_check(ptr, 1, filename, lineno);
#endif
HANDLE_BLOCK_INTERRUPTIONS();
/* remove the block from the non persistent list */
REMOVE_POINTER_FROM_LIST(p);
@@ -487,6 +580,7 @@ ZEND_API void _persist_alloc(void *ptr)
/* add the block to the persistent list */
ADD_POINTER_TO_LIST(p);
HANDLE_UNBLOCK_INTERRUPTIONS();
}
+40 -26
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _ALLOC_H
#define _ALLOC_H
@@ -29,6 +33,7 @@ typedef struct _mem_header {
long magic;
char *filename;
uint lineno;
int reported;
#endif
struct _mem_header *pNext;
struct _mem_header *pLast;
@@ -37,7 +42,7 @@ typedef struct _mem_header {
unsigned int cached:1;
} mem_header;
typedef union {
typedef union _align_test {
void *ptr;
double dbl;
long lng;
@@ -51,47 +56,54 @@ typedef union {
ZEND_API char *zend_strndup(const char *s, unsigned int length);
BEGIN_EXTERN_C()
#if ZEND_DEBUG
ZEND_API void *_emalloc(size_t size,char *filename,uint lineno);
ZEND_API void _efree(void *ptr,char *filename,uint lineno);
ZEND_API void *_ecalloc(size_t nmemb, size_t size,char *filename,uint lineno);
ZEND_API void *_erealloc(void *ptr, size_t size,char *filename,uint lineno);
ZEND_API char *_estrdup(const char *s,char *filename,uint lineno);
ZEND_API char *_estrndup(const char *s, unsigned int length,char *filename,uint lineno);
ZEND_API void *_emalloc(size_t size, char *filename, uint lineno);
ZEND_API void _efree(void *ptr, char *filename, uint lineno);
ZEND_API void *_ecalloc(size_t nmemb, size_t size, char *filename, uint lineno);
ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure, char *filename, uint lineno);
ZEND_API char *_estrdup(const char *s, char *filename, uint lineno);
ZEND_API char *_estrndup(const char *s, unsigned int length, char *filename, uint lineno);
ZEND_API void _persist_alloc(void *ptr, char *filename, uint lineno);
#define emalloc(size) _emalloc((size),__FILE__,__LINE__)
#define efree(ptr) _efree((ptr),__FILE__,__LINE__)
#define ecalloc(nmemb,size) _ecalloc((nmemb),(size),__FILE__,__LINE__)
#define erealloc(ptr,size) _erealloc((ptr),(size),__FILE__,__LINE__)
#define estrdup(s) _estrdup((s),__FILE__,__LINE__)
#define estrndup(s,length) _estrndup((s),(length),__FILE__,__LINE__)
#define persist_alloc(p) _persist_alloc((p),__FILE__,__LINE__)
#define emalloc(size) _emalloc((size),__FILE__,__LINE__)
#define efree(ptr) _efree((ptr),__FILE__,__LINE__)
#define ecalloc(nmemb,size) _ecalloc((nmemb),(size),__FILE__,__LINE__)
#define erealloc(ptr,size) _erealloc((ptr),(size),0,__FILE__,__LINE__)
#define erealloc_recoverable(ptr,size) _erealloc((ptr),(size),1,__FILE__,__LINE__)
#define estrdup(s) _estrdup((s),__FILE__,__LINE__)
#define estrndup(s,length) _estrndup((s),(length),__FILE__,__LINE__)
#define persist_alloc(p) _persist_alloc((p),__FILE__,__LINE__)
#else
ZEND_API void *_emalloc(size_t size);
ZEND_API void _efree(void *ptr);
ZEND_API void *_ecalloc(size_t nmemb, size_t size);
ZEND_API void *_erealloc(void *ptr, size_t size);
ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure);
ZEND_API char *_estrdup(const char *s);
ZEND_API char *_estrndup(const char *s, unsigned int length);
ZEND_API void _persist_alloc(void *ptr);
#define emalloc(size) _emalloc((size))
#define efree(ptr) _efree((ptr))
#define ecalloc(nmemb,size) _ecalloc((nmemb),(size))
#define erealloc(ptr,size) _erealloc((ptr),(size))
#define estrdup(s) _estrdup((s))
#define estrndup(s,length) _estrndup((s),(length))
#define persist_alloc(p) _persist_alloc((p))
#define emalloc(size) _emalloc((size))
#define efree(ptr) _efree((ptr))
#define ecalloc(nmemb,size) _ecalloc((nmemb),(size))
#define erealloc(ptr,size) _erealloc((ptr),(size),0)
#define erealloc_recoverable(ptr,size) _erealloc((ptr),(size),1)
#define estrdup(s) _estrdup((s))
#define estrndup(s,length) _estrndup((s),(length))
#define persist_alloc(p) _persist_alloc((p))
#endif
#define pemalloc(size,persistent) ((persistent)?malloc(size):emalloc(size))
#define pefree(ptr,persistent) ((persistent)?free(ptr):efree(ptr))
#define pecalloc(nmemb,size,persistent) ((persistent)?calloc((nmemb),(size)):ecalloc((nmemb),(size)))
#define perealloc(ptr,size,persistent) ((persistent)?realloc((ptr),(size)):erealloc((ptr),(size)))
#define perealloc_recoverable(ptr,size,persistent) ((persistent)?realloc((ptr),(size)):erealloc_recoverable((ptr),(size)))
#define pestrdup(s,persistent) ((persistent)?strdup(s):estrdup(s))
#define safe_estrdup(ptr) ((ptr)?(estrdup(ptr)):(empty_string))
#define safe_estrndup(ptr,len) ((ptr)?(estrndup((ptr),(len))):(empty_string))
ZEND_API int zend_set_memory_limit(unsigned int memory_limit);
ZEND_API void start_memory_manager(void);
ZEND_API void shutdown_memory_manager(int silent, int clean_cache);
@@ -107,6 +119,8 @@ ZEND_API void _full_mem_check(int silent, char *filename, uint lineno);
#endif
END_EXTERN_C()
#endif
/*
+250 -94
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include "zend.h"
#include "zend_compile.h"
#include "zend_llist.h"
@@ -22,7 +26,7 @@
#include "zend_operators.h"
zend_op_array *(*zend_compile_files)(int mark_as_ref CLS_DC, int file_count, ...);
ZEND_API zend_op_array *(*zend_compile_files)(int mark_as_ref CLS_DC, int file_count, ...);
#ifndef ZTS
@@ -65,7 +69,9 @@ void init_compiler(CLS_D ELS_DC)
CG(asp_tags) = ZEND_UV(asp_tags);
CG(handle_op_arrays) = 1;
zend_hash_apply(&module_registry, (int (*)(void *)) module_registry_request_startup);
init_resource_list();
init_resource_list(ELS_C);
CG(unclean_shutdown) = 0;
zend_llist_init(&CG(open_files), sizeof(void *), zend_open_file_dtor, 0);
}
@@ -78,8 +84,7 @@ void shutdown_compiler(CLS_D)
zend_llist_destroy(&CG(filenames_list));
zend_hash_apply(CG(function_table), (int (*)(void *)) is_not_internal_function);
zend_hash_apply(CG(class_table), (int (*)(void *)) is_not_internal_class);
destroy_resource_list();
zend_hash_apply(&module_registry, (int (*)(void *)) module_registry_cleanup);
zend_llist_destroy(&CG(open_files));
}
@@ -154,6 +159,19 @@ void do_binary_assign_op(int op, znode *result, znode *op1, znode *op2 CLS_DC)
}
void do_fetch_globals(znode *varname CLS_DC)
{
if (!CG(active_op_array)->uses_globals
&& varname->op_type == IS_CONST
&& varname->u.constant.type == IS_STRING
&& varname->u.constant.value.str.len == (sizeof("GLOBALS")-1)
&& !memcmp(varname->u.constant.value.str.val, "GLOBALS", sizeof("GLOBALS")-1)) {
CG(active_op_array)->uses_globals = 1;
}
}
void fetch_simple_variable(znode *result, znode *varname, int bp CLS_DC)
{
int next_op_number = get_next_op_number(CG(active_op_array));
@@ -196,6 +214,7 @@ void fetch_array_dim(znode *result, znode *parent, znode *dim CLS_DC)
opline->result.u.var = get_temporary_variable(CG(active_op_array));
opline->op1 = *parent;
opline->op2 = *dim;
opline->extended_value = ZEND_FETCH_STANDARD;
*result = opline->result;
zend_stack_top(&CG(bp_stack), (void **) &fetch_list_ptr);
@@ -209,7 +228,7 @@ void do_print(znode *result, znode *arg CLS_DC)
opline->result.op_type = IS_TMP_VAR;
opline->result.u.var = get_temporary_variable(CG(active_op_array));
opline->opcode = ZEND_PRINT_OP;
opline->opcode = ZEND_PRINT;
opline->op1 = *arg;
SET_UNUSED(opline->op2);
*result = opline->result;
@@ -220,7 +239,7 @@ void do_echo(znode *arg CLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
opline->opcode = ZEND_ECHO_OP;
opline->opcode = ZEND_ECHO;
opline->op1 = *arg;
SET_UNUSED(opline->op2);
}
@@ -479,7 +498,7 @@ void do_end_variable_parse(int type CLS_DC)
}
void do_init_string(znode *result)
void do_init_string(znode *result CLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
@@ -604,11 +623,22 @@ void do_begin_function_declaration(znode *function_token, znode *function_name,
if (is_method) {
zend_hash_update(&CG(active_class_entry)->function_table, name, name_len+1, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array));
} else {
zend_hash_add(CG(function_table), name, name_len+1, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array));
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
opline->opcode = ZEND_DECLARE_FUNCTION_OR_CLASS;
opline->op1.op_type = IS_CONST;
opline->op1.u.constant.type = IS_LONG;
opline->op1.u.constant.value.lval = zend_hash_next_free_element(CG(function_table));
opline->op2.op_type = IS_CONST;
opline->op2.u.constant.type = IS_STRING;
opline->op2.u.constant.value.str.val = estrndup(name, name_len);
opline->op2.u.constant.value.str.len = name_len;
opline->extended_value = ZEND_DECLARE_FUNCTION;
zend_hash_next_index_insert(CG(function_table), &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array));
}
if (CG(extended_info)) {
zend_op *opline = get_next_op(CG(active_op_array));
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
opline->opcode = ZEND_EXT_NOP;
opline->lineno = function_begin_line;
@@ -632,7 +662,7 @@ void do_receive_arg(int op, znode *var, znode *offset, znode *initialization, un
opline->opcode = op;
opline->result = *var;
opline->op1 = *offset;
if (initialization) {
if ((op == ZEND_RECV_INIT) && initialization) {
opline->op2 = *initialization;
} else {
SET_UNUSED(opline->op2);
@@ -640,15 +670,15 @@ void do_receive_arg(int op, znode *var, znode *offset, znode *initialization, un
if (pass_type==BYREF_FORCE && !CG(active_op_array)->arg_types) {
int i;
CG(active_op_array)->arg_types = (unsigned char *) emalloc(sizeof(unsigned char)*(offset->u.constant.value.lval+2));
for (i=1; i<=offset->u.constant.value.lval; i++) {
CG(active_op_array)->arg_types = (unsigned char *) emalloc(sizeof(unsigned char)*(offset->u.constant.value.lval+1));
for (i=1; i<offset->u.constant.value.lval; i++) {
CG(active_op_array)->arg_types[i] = BYREF_NONE;
}
CG(active_op_array)->arg_types[0]=(unsigned char) offset->u.constant.value.lval;
}
if (CG(active_op_array)->arg_types) {
CG(active_op_array)->arg_types = (unsigned char *) erealloc(CG(active_op_array)->arg_types, sizeof(unsigned char)*(offset->u.constant.value.lval+2));
CG(active_op_array)->arg_types[offset->u.constant.value.lval+1] = pass_type;
CG(active_op_array)->arg_types = (unsigned char *) erealloc(CG(active_op_array)->arg_types, sizeof(unsigned char)*(offset->u.constant.value.lval+1));
CG(active_op_array)->arg_types[offset->u.constant.value.lval] = pass_type;
CG(active_op_array)->arg_types[0]++;
}
}
@@ -656,7 +686,6 @@ void do_receive_arg(int op, znode *var, znode *offset, znode *initialization, un
void do_begin_function_call(znode *function_name CLS_DC)
{
zend_op *opline ;
zend_function *function;
zend_str_tolower(function_name->u.constant.value.str.val, function_name->u.constant.value.str.len);
@@ -668,26 +697,20 @@ void do_begin_function_call(znode *function_name CLS_DC)
return;
}
opline = get_next_op(CG(active_op_array) CLS_CC);
switch (function->type) {
case ZEND_USER_FUNCTION: {
zend_op_array *op_array = (zend_op_array *) function;
zend_stack_push(&CG(function_call_stack), (void *) &op_array->arg_types, sizeof(unsigned char *));
zend_stack_push(&CG(function_call_stack), (void *) &op_array, sizeof(zend_function *));
}
break;
case ZEND_INTERNAL_FUNCTION: {
zend_internal_function *internal_function = (zend_internal_function *) function;
zend_stack_push(&CG(function_call_stack), (void *) &internal_function->arg_types, sizeof(unsigned char *));
zend_stack_push(&CG(function_call_stack), (void *) &internal_function, sizeof(zend_function *));
}
break;
}
opline->opcode = ZEND_INIT_FCALL;
SET_UNUSED(opline->op1);
SET_UNUSED(opline->op2);
}
@@ -696,16 +719,18 @@ void do_begin_dynamic_function_call(znode *function_name CLS_DC)
unsigned char *ptr = NULL;
int last_op_number = get_next_op_number(CG(active_op_array))-1;
if (CG(active_op_array)->opcodes[last_op_number].opcode == ZEND_FETCH_OBJ_R) {
if (last_op_number>=0 && CG(active_op_array)->opcodes[last_op_number].opcode == ZEND_FETCH_OBJ_R) {
CG(active_op_array)->opcodes[last_op_number].opcode = ZEND_INIT_FCALL_BY_NAME;
CG(active_op_array)->opcodes[last_op_number].extended_value = ZEND_MEMBER_FUNC_CALL;
} else {
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
opline->opcode = ZEND_INIT_FCALL_BY_NAME;
opline->op2 = *function_name;
opline->extended_value = 0;
SET_UNUSED(opline->op1);
}
zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(unsigned char *));
zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(zend_function *));
}
@@ -718,17 +743,22 @@ void do_begin_class_member_function_call(znode *class_name, znode *function_name
zend_str_tolower(class_name->u.constant.value.str.val, class_name->u.constant.value.str.len);
opline->op1 = *class_name;
opline->op2 = *function_name;
opline->extended_value = ZEND_MEMBER_FUNC_CALL;
zval_copy_ctor(&opline->op2.u.constant);
zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(unsigned char *));
zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(zend_function *));
}
void do_end_function_call(znode *function_name, znode *result, int is_method CLS_DC)
void do_end_function_call(znode *function_name, znode *result, znode *argument_list, int is_method CLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
ELS_FETCH();
opline->opcode = ZEND_DO_FCALL;
if (function_name->op_type==IS_CONST && !is_method) {
opline->opcode = ZEND_DO_FCALL;
} else {
opline->opcode = ZEND_DO_FCALL_BY_NAME;
}
opline->op1 = *function_name;
opline->result.u.var = get_temporary_variable(CG(active_op_array));
opline->result.op_type = IS_TMP_VAR;
@@ -736,17 +766,26 @@ void do_end_function_call(znode *function_name, znode *result, int is_method CLS
SET_UNUSED(opline->op2);
opline->op2.u.constant.value.lval = is_method;
zend_stack_del_top(&CG(function_call_stack));
opline->extended_value = argument_list->u.constant.value.lval;
}
void do_pass_param(znode *param, int op, int offset CLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
unsigned char **arg_types_ptr, *arg_types;
unsigned char *arg_types;
int original_op=op;
zend_function **function_ptr_ptr, *function_ptr;
zend_stack_top(&CG(function_call_stack), (void **) &arg_types_ptr);
arg_types = *arg_types_ptr;
zend_stack_top(&CG(function_call_stack), (void **) &function_ptr_ptr);
function_ptr = *function_ptr_ptr;
if (function_ptr) {
arg_types = function_ptr->common.arg_types;
opline->extended_value = ZEND_DO_FCALL;
} else {
arg_types = NULL;
opline->extended_value = ZEND_DO_FCALL_BY_NAME;
}
if (op == ZEND_SEND_VAL) {
switch (param->op_type) {
@@ -759,8 +798,8 @@ void do_pass_param(znode *param, int op, int offset CLS_DC)
break;
}
}
if (arg_types && offset<arg_types[0]
&& arg_types[1+offset]==BYREF_FORCE) {
if (arg_types && offset<=arg_types[0]
&& arg_types[offset]==BYREF_FORCE) {
/* change to passing by reference */
switch (param->op_type) {
case IS_VAR:
@@ -775,7 +814,11 @@ void do_pass_param(znode *param, int op, int offset CLS_DC)
if (original_op==ZEND_SEND_VAR) {
switch(op) {
case ZEND_SEND_VAR:
do_end_variable_parse(BP_VAR_R CLS_CC);
if (function_ptr) {
do_end_variable_parse(BP_VAR_R CLS_CC);
} else {
do_end_variable_parse(BP_VAR_W CLS_CC);
}
break;
case ZEND_SEND_REF:
do_end_variable_parse(BP_VAR_W CLS_CC);
@@ -800,13 +843,100 @@ void do_return(znode *expr CLS_DC)
} else {
var_uninit(&opline->op1.u.constant);
opline->op1.op_type = IS_CONST;
opline->op1.u.constant.refcount=1;
opline->op1.u.constant.is_ref=0;
INIT_PZVAL(&opline->op1.u.constant);
}
SET_UNUSED(opline->op2);
}
static void function_add_ref(zend_function *function)
{
if (function->type == ZEND_USER_FUNCTION) {
(*((zend_op_array *) function)->refcount)++;
}
}
ZEND_API void do_bind_function_or_class(zend_op *opline, HashTable *function_table, HashTable *class_table)
{
switch (opline->extended_value) {
case ZEND_DECLARE_FUNCTION: {
zend_function *function;
zend_hash_index_find(function_table, opline->op1.u.constant.value.lval, (void **) &function);
(*function->op_array.refcount)++;
if (zend_hash_add(function_table, opline->op2.u.constant.value.str.val, opline->op2.u.constant.value.str.len+1, function, sizeof(zend_function), NULL)==FAILURE) {
zend_error(E_COMPILE_ERROR, "Cannot redeclare %s()", opline->op2.u.constant.value.str.val);
}
}
break;
case ZEND_DECLARE_CLASS: {
zend_class_entry *ce;
zend_hash_index_find(class_table, opline->op1.u.constant.value.lval, (void **) &ce);
(*ce->refcount)++;
if (zend_hash_add(class_table, opline->op2.u.constant.value.str.val, opline->op2.u.constant.value.str.len+1, ce, sizeof(zend_class_entry), NULL)==FAILURE) {
zend_error(E_COMPILE_ERROR, "Cannot redeclare class %s", opline->op2.u.constant.value.str.val);
}
}
break;
case ZEND_DECLARE_INHERITED_CLASS: {
zend_class_entry *ce, *parent_ce;
char *class_name, *parent_name;
zend_function tmp_zend_function;
zval *tmp;
zend_hash_index_find(class_table, opline->op1.u.constant.value.lval, (void **) &ce);
(*ce->refcount)++;
/* Restore base class / derived class names */
parent_name = opline->op2.u.constant.value.str.val;
class_name = strchr(opline->op2.u.constant.value.str.val, ':');
if (!class_name) {
zend_error(E_COMPILE_ERROR, "Invalid runtime class entry");
}
*class_name++ = 0;
/* Obtain parent class */
if (zend_hash_find(class_table, parent_name, strlen(parent_name)+1, (void **) &parent_ce)==FAILURE) {
zend_error(E_COMPILE_ERROR, "Class %s: Cannot inherit from undefined class %s", class_name, parent_name);
}
/* Perform inheritence */
zend_hash_copy(&ce->function_table, &parent_ce->function_table, (void (*)(void *)) function_add_ref, &tmp_zend_function, sizeof(zend_function));
zend_hash_copy(&ce->default_properties, &parent_ce->default_properties, (void (*)(void *)) zval_add_ref, (void *) &tmp, sizeof(zval *));
/* Register the derived class */
if (zend_hash_add(class_table, class_name, strlen(class_name)+1, ce, sizeof(zend_class_entry), NULL)==FAILURE) {
zend_error(E_COMPILE_ERROR, "Cannot redeclare class %s", opline->op2.u.constant.value.str.val);
}
}
break;
}
}
void do_early_binding(CLS_D)
{
zend_op *opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last-1];
do_bind_function_or_class(opline, CG(function_table), CG(class_table));
switch (opline->extended_value) {
case ZEND_DECLARE_FUNCTION:
zend_hash_index_del(CG(function_table), opline->op1.u.constant.value.lval);
break;
case ZEND_DECLARE_CLASS:
zend_hash_index_del(CG(class_table), opline->op1.u.constant.value.lval);
break;
}
zval_dtor(&opline->op2.u.constant);
opline->opcode = ZEND_NOP;
SET_UNUSED(opline->op1);
SET_UNUSED(opline->op2);
//CG(active_op_array)->last--;
}
void do_boolean_or_begin(znode *expr1, znode *op_token CLS_DC)
{
int next_op_number = get_next_op_number(CG(active_op_array));
@@ -891,6 +1021,7 @@ void do_do_while_end(znode *do_token, znode *expr CLS_DC)
opline->opcode = ZEND_JMPNZ;
opline->op1 = *expr;
opline->op2.u.opline_num = do_token->u.opline_num;
SET_UNUSED(opline->op2);
do_end_loop(do_token->u.opline_num CLS_CC);
@@ -910,8 +1041,7 @@ void do_brk_cont(int op, znode *expr CLS_DC)
} else {
opline->op2.u.constant.type = IS_LONG;
opline->op2.u.constant.value.lval = 1;
opline->op2.u.constant.refcount=1;
opline->op2.u.constant.is_ref=0;
INIT_PZVAL(&opline->op2.u.constant);
opline->op2.op_type = IS_CONST;
}
}
@@ -920,12 +1050,17 @@ void do_brk_cont(int op, znode *expr CLS_DC)
void do_switch_cond(znode *cond CLS_DC)
{
zend_switch_entry switch_entry;
zend_op *opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last-1];
switch_entry.cond = *cond;
switch_entry.default_case = -1;
switch_entry.control_var = -1;
zend_stack_push(&CG(switch_cond_stack), (void *) &switch_entry, sizeof(switch_entry));
if (opline->result.op_type == IS_VAR) {
opline->result.u.EA.type |= EXT_TYPE_UNUSED;
}
do_begin_loop(CLS_C);
INC_BPC(CG(active_op_array));
@@ -1056,8 +1191,7 @@ void do_default_before_statement(znode *case_list, znode *default_token CLS_DC)
opline->op1.op_type = IS_CONST;
opline->op1.u.constant.type = IS_LONG;
opline->op1.u.constant.value.lval = 1;
opline->op1.u.constant.refcount=1;
opline->op1.u.constant.is_ref=0;
INIT_PZVAL(&opline->op1.u.constant);
SET_UNUSED(opline->op2);
switch_entry_ptr->default_case = next_op_number;
@@ -1068,16 +1202,12 @@ void do_default_before_statement(znode *case_list, znode *default_token CLS_DC)
CG(active_op_array)->opcodes[case_list->u.opline_num].op1.u.opline_num = next_op_number;
}
static void function_add_ref(zend_function *function)
{
if (function->type == ZEND_USER_FUNCTION) {
(*((zend_op_array *) function)->refcount)++;
}
}
void do_begin_class_declaration(znode *class_name, znode *parent_class_name CLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
int runtime_inheritence = 0;
if (CG(active_class_entry)) {
zend_error(E_COMPILE_ERROR, "Class declarations may not be nested");
return;
@@ -1085,10 +1215,12 @@ void do_begin_class_declaration(znode *class_name, znode *parent_class_name CLS_
CG(class_entry).type = ZEND_USER_CLASS;
CG(class_entry).name = class_name->u.constant.value.str.val;
CG(class_entry).name_length = class_name->u.constant.value.str.len;
CG(class_entry).refcount = (int *) emalloc(sizeof(int));
*CG(class_entry).refcount = 1;
zend_str_tolower(CG(class_entry).name, CG(class_entry).name_length);
zend_hash_init(&CG(class_entry).function_table, 10, NULL, (void (*)(void *)) destroy_zend_function, 0);
zend_hash_init(&CG(class_entry).function_table, 10, NULL, ZEND_FUNCTION_DTOR, 0);
zend_hash_init(&CG(class_entry).default_properties, 10, NULL, PVAL_PTR_DTOR, 0);
/* code for inheritance from parent class */
@@ -1097,17 +1229,19 @@ void do_begin_class_declaration(znode *class_name, znode *parent_class_name CLS_
zend_function tmp_zend_function;
zval *tmp;
if (zend_hash_find(CG(class_table), parent_class_name->u.constant.value.str.val, parent_class_name->u.constant.value.str.len+1, (void **) &parent_class)==FAILURE) {
zend_error(E_ERROR, "Undefined parent class '%s'", parent_class_name->u.constant.value.str.val);
return;
zend_str_tolower(parent_class_name->u.constant.value.str.val, parent_class_name->u.constant.value.str.len);
if (zend_hash_find(CG(class_table), parent_class_name->u.constant.value.str.val, parent_class_name->u.constant.value.str.len+1, (void **) &parent_class)==SUCCESS) {
/* copy functions */
zend_hash_copy(&CG(class_entry).function_table, &parent_class->function_table, (void (*)(void *)) function_add_ref, &tmp_zend_function, sizeof(zend_function));
/* copy default properties */
zend_hash_copy(&CG(class_entry).default_properties, &parent_class->default_properties, (void (*)(void *)) zval_add_ref, (void *) &tmp, sizeof(zval *));
zval_dtor(&parent_class_name->u.constant);
} else {
runtime_inheritence = 1;
}
/* copy functions */
zend_hash_copy(&CG(class_entry).function_table, &parent_class->function_table, (void (*)(void *)) function_add_ref, &tmp_zend_function, sizeof(zend_function));
/* copy default properties */
zend_hash_copy(&CG(class_entry).default_properties, &parent_class->default_properties, (void (*)(void *)) zval_add_ref, (void *) &tmp, sizeof(zval *));
zval_dtor(&parent_class_name->u.constant);
} else {
CG(class_entry).parent = NULL;
}
@@ -1116,7 +1250,33 @@ void do_begin_class_declaration(znode *class_name, znode *parent_class_name CLS_
CG(class_entry).handle_property_set = NULL;
CG(class_entry).handle_property_get = NULL;
zend_hash_add(CG(class_table), CG(class_entry).name, CG(class_entry).name_length+1, &CG(class_entry), sizeof(zend_class_entry), (void **) &CG(active_class_entry));
opline->opcode = ZEND_DECLARE_FUNCTION_OR_CLASS;
opline->op1.op_type = IS_CONST;
opline->op1.u.constant.type = IS_LONG;
opline->op1.u.constant.value.lval = zend_hash_next_free_element(CG(class_table));
opline->op2.op_type = IS_CONST;
opline->op2.u.constant.type = IS_STRING;
if (runtime_inheritence) {
char *full_class_name;
opline->op2.u.constant.value.str.len = parent_class_name->u.constant.value.str.len+1+CG(class_entry).name_length;
full_class_name = opline->op2.u.constant.value.str.val = (char *) emalloc(opline->op2.u.constant.value.str.len+1);
memcpy(full_class_name, parent_class_name->u.constant.value.str.val, parent_class_name->u.constant.value.str.len);
full_class_name += parent_class_name->u.constant.value.str.len;
full_class_name[0] = ':';
full_class_name++;
memcpy(full_class_name, CG(class_entry).name, CG(class_entry).name_length);
full_class_name += CG(class_entry).name_length;
full_class_name[0] = 0;
opline->extended_value = ZEND_DECLARE_INHERITED_CLASS;
} else {
opline->op2.u.constant.value.str.val = estrndup(CG(class_entry).name, CG(class_entry).name_length);
opline->op2.u.constant.value.str.len = CG(class_entry).name_length;
opline->extended_value = ZEND_DECLARE_CLASS;
}
zend_hash_next_index_insert(CG(class_table), &CG(class_entry), sizeof(zend_class_entry), (void **) &CG(active_class_entry));
}
@@ -1199,18 +1359,19 @@ void do_begin_new_object(znode *result, znode *variable, znode *new_token, znode
opline->opcode = ZEND_INIT_FCALL_BY_NAME;
opline->op1 = *result;
opline->op2 = *class_name;
opline->extended_value = ZEND_MEMBER_FUNC_CALL | ZEND_CTOR_CALL;
zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(unsigned char *));
}
void do_end_new_object(znode *class_name, znode *new_token CLS_DC)
void do_end_new_object(znode *class_name, znode *new_token, znode *argument_list CLS_DC)
{
znode ctor_result;
if (class_name->op_type == IS_CONST) {
zval_copy_ctor(&class_name->u.constant);
}
do_end_function_call(class_name, &ctor_result, 1 CLS_CC);
do_end_function_call(class_name, &ctor_result, argument_list, 1 CLS_CC);
do_free(&ctor_result CLS_CC);
CG(active_op_array)->opcodes[new_token->u.opline_num].op2.u.opline_num = get_next_op_number(CG(active_op_array));
@@ -1223,7 +1384,6 @@ void do_fetch_constant(znode *result, znode *constant_name, int mode CLS_DC)
case ZEND_CT:
*result = *constant_name;
result->u.constant.type = IS_CONSTANT;
printf("Fetching compiletime constant: '%s'\n", result->u.constant.value.str.val);
break;
case ZEND_RT: {
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
@@ -1244,11 +1404,6 @@ void do_shell_exec(znode *result, znode *cmd CLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
opline->opcode = ZEND_INIT_FCALL;
SET_UNUSED(opline->op1);
SET_UNUSED(opline->op2);
opline = get_next_op(CG(active_op_array) CLS_CC);
switch (cmd->op_type) {
case IS_TMP_VAR:
opline->opcode = ZEND_SEND_VAL;
@@ -1259,6 +1414,7 @@ void do_shell_exec(znode *result, znode *cmd CLS_DC)
}
opline->op1 = *cmd;
opline->op2.u.opline_num = 0;
opline->extended_value = ZEND_DO_FCALL;
SET_UNUSED(opline->op2);
opline = get_next_op(CG(active_op_array) CLS_CC);
@@ -1267,10 +1423,10 @@ void do_shell_exec(znode *result, znode *cmd CLS_DC)
opline->result.op_type = IS_TMP_VAR;
opline->op1.u.constant.value.str.val = estrndup("shell_exec",sizeof("shell_exec")-1);
opline->op1.u.constant.value.str.len = sizeof("shell_exec")-1;
opline->op1.u.constant.refcount = 1;
opline->op1.u.constant.is_ref = 0;
INIT_PZVAL(&opline->op1.u.constant);
opline->op1.u.constant.type = IS_STRING;
opline->op1.op_type = IS_CONST;
opline->extended_value = 1;
SET_UNUSED(opline->op2);
*result = opline->result;
}
@@ -1315,7 +1471,7 @@ void do_add_array_element(znode *result, znode *expr, znode *offset CLS_DC)
void do_add_static_array_element(znode *result, znode *expr, znode *offset)
void do_add_static_array_element(znode *result, znode *offset, znode *expr)
{
zval *element = (zval *) emalloc(sizeof(zval));
@@ -1324,6 +1480,7 @@ void do_add_static_array_element(znode *result, znode *expr, znode *offset)
switch (offset->u.constant.type) {
case IS_STRING:
zend_hash_update(result->u.constant.value.ht, offset->u.constant.value.str.val, offset->u.constant.value.str.len+1, &element, sizeof(zval *), NULL);
zval_dtor(&offset->u.constant);
break;
case IS_LONG:
zend_hash_index_update(result->u.constant.value.ht, offset->u.constant.value.lval, &element, sizeof(zval *), NULL);
@@ -1339,7 +1496,7 @@ void do_add_list_element(znode *element CLS_DC)
{
list_llist_element lle;
if(element) {
if (element) {
lle.var = *element;
zend_llist_copy(&lle.dimensions, &CG(dimension_llist));
zend_llist_add_element(&CG(list_llist), &lle);
@@ -1357,7 +1514,6 @@ void do_new_list_begin(CLS_D)
void do_new_list_end(CLS_D)
{
zend_llist_remove_tail(&CG(dimension_llist));
(*((int *)CG(dimension_llist).tail->data))++;
}
@@ -1405,8 +1561,12 @@ void do_list_end(znode *result, znode *expr CLS_DC)
opline->op2.op_type = IS_CONST;
opline->op2.u.constant.type = IS_LONG;
opline->op2.u.constant.value.lval = *((int *) dimension->data);
opline->op2.u.constant.refcount = 1;
opline->op2.u.constant.is_ref = 0;
INIT_PZVAL(&opline->op2.u.constant);
if (le == CG(list_llist).tail) {
opline->extended_value = ZEND_FETCH_STANDARD;
} else {
opline->extended_value = ZEND_FETCH_ADD_LOCK;
}
last_container = opline->result;
dimension = dimension->next;
}
@@ -1418,6 +1578,7 @@ void do_list_end(znode *result, znode *expr CLS_DC)
le = CG(list_llist).head;
while (le) {
do_assign(result, &((list_llist_element *) le->data)->var, &((list_llist_element *) le->data)->value CLS_CC);
CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result.u.EA.type |= EXT_TYPE_UNUSED;
le = le->next;
}
zend_llist_destroy(&CG(dimension_llist));
@@ -1431,7 +1592,7 @@ void do_fetch_global_or_static_variable(znode *varname, znode *static_assignment
zend_op *opline = get_next_op(CG(active_op_array) CLS_CC);
znode lval;
if (fetch_type==ZEND_FETCH_STATIC) {
if (fetch_type==ZEND_FETCH_STATIC && static_assignment) {
zval *tmp = (zval *) emalloc(sizeof(zval));
convert_to_string(&varname->u.constant);
@@ -1459,6 +1620,7 @@ void do_fetch_global_or_static_variable(znode *varname, znode *static_assignment
do_assign_ref(NULL, &lval, &opline->result CLS_CC);
CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result.u.EA.type |= EXT_TYPE_UNUSED;
}
@@ -1584,6 +1746,7 @@ void do_foreach_cont(znode *value, znode *key, znode *as_token CLS_DC)
opline->op2.op_type = IS_CONST;
opline->op2.u.constant.type = IS_LONG;
opline->op2.u.constant.value.lval = 0;
opline->extended_value = ZEND_FETCH_STANDARD; /* ignored in fetch_dim_tmp_var, but what the hell. */
result_value = opline->result;
if (key->op_type != IS_UNUSED) {
@@ -1596,6 +1759,7 @@ void do_foreach_cont(znode *value, znode *key, znode *as_token CLS_DC)
opline->op2.op_type = IS_CONST;
opline->op2.u.constant.type = IS_LONG;
opline->op2.u.constant.value.lval = 1;
opline->extended_value = ZEND_FETCH_STANDARD; /* ignored in fetch_dim_tmp_var, but what the hell. */
result_key = opline->result;
}
@@ -1791,32 +1955,24 @@ int zendlex(znode *zendlval CLS_DC)
{
int retval;
#if 0
#if (WIN32|WINNT)
if (GLOBAL(wintimer) && !(++GLOBAL(wintimer_counter) & 0xff) && (GLOBAL(wintimer) < (unsigned int) clock())) {
zend_error(E_WARNING, "PHP Timed out!<br>\n");
}
#endif
#endif
zendlval->u.constant.type = IS_LONG;
retval = lex_scan(&zendlval->u.constant CLS_CC);
switch(retval) {
case ZEND_COMMENT:
case PHP_OPEN_TAG:
case T_COMMENT:
case T_OPEN_TAG:
case T_WHITESPACE:
case T_PHP_TRACK_VARS:
retval = zendlex(zendlval CLS_CC);
break;
case PHP_CLOSE_TAG:
case T_CLOSE_TAG:
retval = ';'; /* implicit ; */
break;
case PHP_OPEN_TAG_WITH_ECHO:
retval = ZEND_ECHO;
case T_OPEN_TAG_WITH_ECHO:
retval = T_ECHO;
break;
}
zendlval->u.constant.refcount = 1;
zendlval->u.constant.is_ref = 0;
INIT_PZVAL(&zendlval->u.constant);
zendlval->op_type = IS_CONST;
return retval;
}
+96 -36
View File
@@ -4,26 +4,40 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _COMPILE_H
#define _COMPILE_H
#include "zend.h"
#if HAVE_STDARG_H
#include <stdarg.h>
#endif
#include "zend_llist.h"
#define YYSTYPE znode
#include "zend-parser.h"
#define DEBUG_ZEND 0
#ifndef ZTS
#define SUPPORT_INTERACTIVE 1
#else
#define SUPPORT_INTERACTIVE 0
#endif
#define FREE_PNODE(znode) zval_dtor(&znode->u.constant);
#define FREE_OP(op, should_free) if (should_free) zval_dtor(&Ts[(op)->u.var].tmp_var);
@@ -41,7 +55,7 @@
typedef struct _zend_op_array zend_op_array;
typedef struct {
typedef struct _znode {
int op_type;
union {
zval constant;
@@ -62,12 +76,13 @@ typedef struct _zend_op {
znode result;
znode op1;
znode op2;
ulong extended_value;
char *filename;
uint lineno;
} zend_op;
typedef struct {
typedef struct _zend_brk_cont_element {
int cont;
int brk;
int parent;
@@ -91,6 +106,7 @@ struct _zend_op_array {
zend_brk_cont_element *brk_cont_array;
int last_brk_cont;
int current_brk_cont;
unsigned char uses_globals;
/* static variables support */
HashTable *static_variables;
@@ -105,7 +121,7 @@ struct _zend_op_array {
};
typedef struct {
typedef struct _zend_internal_function {
int type; /* MUST be the first element of this struct! */
unsigned char *arg_types; /* MUST be the second element of this struct */
@@ -115,7 +131,7 @@ typedef struct {
} zend_internal_function;
typedef union {
typedef union _zend_function {
int type; /* MUST be the first element of this struct! */
struct {
int type; /* never used */
@@ -127,28 +143,28 @@ typedef union {
} zend_function;
typedef struct {
typedef struct _zend_function_state {
HashTable *function_symbol_table;
zend_function *function;
void *reserved[4];
} zend_function_state;
typedef struct {
typedef struct _zend_switch_entry {
znode cond;
int default_case;
int control_var;
} zend_switch_entry;
typedef struct {
typedef struct _list_llist_element {
znode var;
zend_llist dimensions;
znode value;
} list_llist_element;
typedef struct {
typedef struct _zend_file_handle {
int type;
char *filename;
union {
@@ -174,10 +190,13 @@ typedef struct {
void init_compiler(CLS_D ELS_DC);
void shutdown_compiler(CLS_D);
extern zend_op_array *(*zend_compile_files)(int mark_as_ref CLS_DC, int file_count, ...);
BEGIN_EXTERN_C()
extern ZEND_API zend_op_array *(*zend_compile_files)(int mark_as_ref CLS_DC, int file_count, ...);
void zend_activate(CLS_D ELS_DC);
void zend_deactivate(CLS_D ELS_DC);
int lex_scan(zval *zendlval CLS_DC);
void reset_scanner(CLS_D);
void startup_scanner(CLS_D);
void shutdown_scanner(CLS_D);
@@ -185,6 +204,12 @@ ZEND_API void zend_set_compiled_filename(char *new_compiled_filename);
ZEND_API void zend_restore_compiled_filename(char *original_compiled_filename);
ZEND_API char *zend_get_compiled_filename();
#ifdef ZTS
const char *zend_get_zendtext(CLS_D);
int zend_get_zendleng(CLS_D);
#endif
END_EXTERN_C()
/* parser-driven code generators */
void do_binary_op(int op, znode *result, znode *op1, znode *op2 CLS_DC);
@@ -195,12 +220,14 @@ void do_assign_ref(znode *result, znode *lvar, znode *rvar CLS_DC);
void fetch_simple_variable(znode *result, znode *varname, int bp CLS_DC);
void do_indirect_references(znode *result, znode *num_references, znode *variable CLS_DC);
void do_fetch_global_or_static_variable(znode *varname, znode *static_assignment, int fetch_type CLS_DC);
void do_fetch_globals(znode *varname CLS_DC);
void fetch_array_begin(znode *result, znode *varname, znode *first_dim CLS_DC);
void fetch_array_dim(znode *result, znode *parent, znode *dim CLS_DC);
void do_print(znode *result, znode *arg CLS_DC);
void do_echo(znode *arg CLS_DC);
ZEND_API void *get_unary_op(int opcode);
typedef int (*unary_op_type)(zval *, zval *);
ZEND_API unary_op_type get_unary_op(int opcode);
ZEND_API void *get_binary_op(int opcode);
void do_while_cond(znode *expr, znode *close_bracket_token CLS_DC);
@@ -225,7 +252,7 @@ void do_end_variable_parse(int type CLS_DC);
void do_free(znode *op1 CLS_DC);
void do_init_string(znode *result);
void do_init_string(znode *result CLS_DC);
void do_add_char(znode *result, znode *op1, znode *op2 CLS_DC);
void do_add_string(znode *result, znode *op1, znode *op2 CLS_DC);
void do_add_variable(znode *result, znode *op1, znode *op2 CLS_DC);
@@ -236,8 +263,10 @@ void do_receive_arg(int op, znode *var, znode *offset, znode *initialization, un
void do_begin_function_call(znode *function_name CLS_DC);
void do_begin_dynamic_function_call(znode *function_name CLS_DC);
void do_begin_class_member_function_call(znode *class_name, znode *function_name CLS_DC);
void do_end_function_call(znode *function_name, znode *result, int is_method CLS_DC);
void do_end_function_call(znode *function_name, znode *result, znode *argument_list, int is_method CLS_DC);
void do_return(znode *expr CLS_DC);
ZEND_API void do_bind_function_or_class(zend_op *opline, HashTable *function_table, HashTable *class_table);
void do_early_binding(CLS_D);
void do_pass_param(znode *param, int op, int offset CLS_DC);
@@ -267,7 +296,7 @@ void do_pop_object(znode *object CLS_DC);
void do_begin_new_object(znode *result, znode *variable, znode *new_token, znode *class_name CLS_DC);
void do_end_new_object(znode *class_name, znode *new_token CLS_DC);
void do_end_new_object(znode *class_name, znode *new_token, znode *argument_list CLS_DC);
void do_fetch_constant(znode *result, znode *constant_name, int mode CLS_DC);
@@ -275,7 +304,7 @@ void do_shell_exec(znode *result, znode *cmd CLS_DC);
void do_init_array(znode *result, znode *expr, znode *offset CLS_DC);
void do_add_array_element(znode *result, znode *expr, znode *offset CLS_DC);
void do_add_static_array_element(znode *result, znode *expr, znode *offset);
void do_add_static_array_element(znode *result, znode *offset, znode *expr);
void do_list_init();
void do_list_end(znode *result, znode *expr CLS_DC);
void do_add_list_element(znode *element CLS_DC);
@@ -307,29 +336,39 @@ void do_extended_info(CLS_D);
void do_extended_fcall_begin(CLS_D);
void do_extended_fcall_end(CLS_D);
#define INITIAL_OP_ARRAY_SIZE 64
/* helper functions in zend-scanner.l */
BEGIN_EXTERN_C()
ZEND_API int require_file(zend_file_handle *file_handle CLS_DC);
ZEND_API int require_filename(char *filename CLS_DC);
ZEND_API zend_op_array *compile_files(int mark_as_ref CLS_DC, int file_count, ...);
ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count, va_list files);
ZEND_API zend_op_array *compile_string(zval *source_string CLS_DC);
ZEND_API zend_op_array *compile_filename(zval *filename CLS_DC);
inline int open_file_for_scanning(zend_file_handle *file_handle CLS_DC);
#define INITIAL_OP_ARRAY_SIZE 1024
ZEND_API inline int open_file_for_scanning(zend_file_handle *file_handle CLS_DC);
ZEND_API void init_op_array(zend_op_array *op_array, int initial_ops_size);
ZEND_API void destroy_op_array(zend_op_array *op_array);
ZEND_API void zend_close_file_handle(zend_file_handle *file_handle CLS_DC);
ZEND_API void zend_open_file_dtor(void *f);
END_EXTERN_C()
ZEND_API int destroy_zend_function(zend_function *function);
ZEND_API int destroy_zend_class(zend_class_entry *ce);
void zend_class_add_ref(zend_class_entry *ce);
#define ZEND_FUNCTION_DTOR (int (*)(void *)) destroy_zend_function
#define ZEND_CLASS_DTOR (int (*)(void *)) destroy_zend_class
void destroy_zend_function(zend_function *function);
void destroy_zend_class(zend_class_entry *ce);
zend_op *get_next_op(zend_op_array *op_array CLS_DC);
int get_next_op_number(zend_op_array *op_array);
int print_class(zend_class_entry *class_entry);
void print_op_array(zend_op_array *op_array, int optimizations);
BEGIN_EXTERN_C()
int pass_two(zend_op_array *op_array);
void pass_include_eval(zend_op_array *op_array);
END_EXTERN_C()
zend_brk_cont_element *get_next_brk_cont_element(zend_op_array *op_array);
@@ -379,8 +418,8 @@ int zendlex(znode *zendlval CLS_DC);
#define ZEND_ASSIGN 36
#define ZEND_ASSIGN_REF 37
#define ZEND_ECHO_OP 38
#define ZEND_PRINT_OP 39
#define ZEND_ECHO 38
#define ZEND_PRINT 39
#define ZEND_JMP 40
#define ZEND_JMPZ 41
@@ -401,9 +440,9 @@ int zendlex(znode *zendlval CLS_DC);
#define ZEND_BEGIN_SILENCE 54
#define ZEND_END_SILENCE 55
#define ZEND_INIT_FCALL 56
#define ZEND_INIT_FCALL_BY_NAME 57
#define ZEND_DO_FCALL 58
#define ZEND_INIT_FCALL_BY_NAME 56
#define ZEND_DO_FCALL 57
#define ZEND_DO_FCALL_BY_NAME 58
#define ZEND_RETURN 59
#define ZEND_RECV 60
@@ -450,11 +489,13 @@ int zendlex(znode *zendlval CLS_DC);
#define ZEND_FETCH_DIM_TMP_VAR 89
#define ZEND_FETCH_CONSTANT 90
#define ZEND_EXT_STMT 91
#define ZEND_EXT_FCALL_BEGIN 92
#define ZEND_EXT_FCALL_END 93
#define ZEND_EXT_NOP 94
#define ZEND_DECLARE_FUNCTION_OR_CLASS 91
#define ZEND_EXT_STMT 92
#define ZEND_EXT_FCALL_BEGIN 93
#define ZEND_EXT_FCALL_END 94
#define ZEND_EXT_NOP 95
/* end of block */
@@ -477,6 +518,7 @@ int zendlex(znode *zendlval CLS_DC);
#define ZEND_INTERNAL_FUNCTION 1
#define ZEND_USER_FUNCTION 2
#define ZEND_OVERLOADED_FUNCTION 3
#define ZEND_EVAL_CODE 4
#define ZEND_INTERNAL_CLASS 1
#define ZEND_USER_CLASS 2
@@ -496,4 +538,22 @@ int zendlex(znode *zendlval CLS_DC);
#define ZEND_HANDLE_FP 2
#define ZEND_HANDLE_ISTREAM 3
#define ZEND_DECLARE_CLASS 1
#define ZEND_DECLARE_FUNCTION 2
#define ZEND_DECLARE_INHERITED_CLASS 3
#define ZEND_FETCH_STANDARD 0
#define ZEND_FETCH_ADD_LOCK 1
#define ZEND_MEMBER_FUNC_CALL 1<<0
#define ZEND_CTOR_CALL 1<<1
#define PZVAL_IS_REF(z) ((z)->EA.is_ref)
#define PZVAL_IS_LOCKED(z) ((z)->EA.locks>0)
#define PZVAL_LOCK(z) (z)->EA.locks++
#define PZVAL_UNLOCK(z) (z)->EA.locks--
#endif /* _COMPILE_H */
+54 -27
View File
@@ -4,10 +4,13 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
@@ -22,12 +25,28 @@
#include "zend_globals.h"
void free_zend_constant(zend_constant *c)
int free_zend_constant(zend_constant *c)
{
if (!(c->flags & CONST_PERSISTENT)) {
zval_dtor(&c->value);
}
free(c->name);
return 1;
}
void copy_zend_constant(zend_constant *c)
{
c->name = zend_strndup(c->name, c->name_len);
zval_copy_ctor(&c->value);
}
void zend_copy_constants(HashTable *target, HashTable *source)
{
zend_constant tmp_constant;
zend_hash_copy(target, source, (void (*)(void *)) copy_zend_constant, &tmp_constant, sizeof(zend_constant));
}
@@ -53,11 +72,13 @@ static int clean_module_constant(zend_constant *c, int *module_number)
void clean_module_constants(int module_number)
{
ELS_FETCH();
zend_hash_apply_with_argument(EG(zend_constants), (int (*)(void *,void *)) clean_module_constant, (void *) &module_number);
}
int zend_startup_constants(void)
int zend_startup_constants(HashTable *constants ELS_DC)
{
#if WIN32|WINNT
DWORD dwBuild=0;
@@ -66,8 +87,19 @@ int zend_startup_constants(void)
DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
#endif
EG(zend_constants) = (HashTable *) malloc(sizeof(HashTable));
/* ZEND_FIX: Move to PHP */
if (zend_hash_init(EG(zend_constants), 20, NULL, ZEND_CONSTANT_DTOR, 1)==FAILURE) {
return FAILURE;
}
return SUCCESS;
}
void zend_register_standard_constants(ELS_D)
{
/* ZEND_FIX: Move to PHP */
#if 0
#if WIN32|WINNT
// Get build numbers for Windows NT or Win95
@@ -82,12 +114,6 @@ int zend_startup_constants(void)
#endif
EG(zend_constants) = (HashTable *) malloc(sizeof(HashTable));
if (zend_hash_init(EG(zend_constants), 20, NULL, (void(*)(void *)) free_zend_constant, 1)==FAILURE) {
return FAILURE;
}
#if 0
/* This should go back to PHP */
REGISTER_MAIN_STRINGL_CONSTANT("PHP_VERSION", PHP_VERSION, sizeof(PHP_VERSION)-1, CONST_PERSISTENT | CONST_CS);
@@ -111,20 +137,18 @@ int zend_startup_constants(void)
c.name_len = 5;
c.value.value.lval = 1;
c.value.type = IS_BOOL;
zend_register_constant(&c);
zend_register_constant(&c ELS_CC);
c.name = zend_strndup("FALSE",5);
c.name_len = 6;
c.value.value.lval = 0;
c.value.type = IS_BOOL;
zend_register_constant(&c);
zend_register_constant(&c ELS_CC);
}
return SUCCESS;
}
int zend_shutdown_constants(void)
int zend_shutdown_constants(ELS_D)
{
zend_hash_destroy(EG(zend_constants));
free(EG(zend_constants));
@@ -134,11 +158,13 @@ int zend_shutdown_constants(void)
void clean_non_persistent_constants(void)
{
ELS_FETCH();
zend_hash_apply(EG(zend_constants), (int (*)(void *)) clean_non_persistent_constant);
}
ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval, int flags, int module_number)
ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval, int flags, int module_number ELS_DC)
{
zend_constant c;
@@ -148,11 +174,11 @@ ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval,
c.name = zend_strndup(name,name_len);
c.name_len = name_len;
c.module_number = module_number;
zend_register_constant(&c);
zend_register_constant(&c ELS_CC);
}
ZEND_API void zend_register_double_constant(char *name, uint name_len, double dval, int flags, int module_number)
ZEND_API void zend_register_double_constant(char *name, uint name_len, double dval, int flags, int module_number ELS_DC)
{
zend_constant c;
@@ -162,11 +188,11 @@ ZEND_API void zend_register_double_constant(char *name, uint name_len, double dv
c.name = zend_strndup(name,name_len);
c.name_len = name_len;
c.module_number = module_number;
zend_register_constant(&c);
zend_register_constant(&c ELS_CC);
}
ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *strval, uint strlen, int flags, int module_number)
ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *strval, uint strlen, int flags, int module_number ELS_DC)
{
zend_constant c;
@@ -177,13 +203,13 @@ ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *st
c.name = zend_strndup(name,name_len);
c.name_len = name_len;
c.module_number = module_number;
zend_register_constant(&c);
zend_register_constant(&c ELS_CC);
}
ZEND_API void zend_register_string_constant(char *name, uint name_len, char *strval, int flags, int module_number)
ZEND_API void zend_register_string_constant(char *name, uint name_len, char *strval, int flags, int module_number ELS_DC)
{
zend_register_stringl_constant(name, name_len, strval, strlen(strval), flags, module_number);
zend_register_stringl_constant(name, name_len, strval, strlen(strval), flags, module_number ELS_CC);
}
@@ -192,6 +218,7 @@ ZEND_API int zend_get_constant(char *name, uint name_len, zval *result)
zend_constant *c;
char *lookup_name = estrndup(name,name_len);
int retval;
ELS_FETCH();
zend_str_tolower(lookup_name, name_len);
@@ -212,7 +239,7 @@ ZEND_API int zend_get_constant(char *name, uint name_len, zval *result)
}
ZEND_API void zend_register_constant(zend_constant *c)
ZEND_API void zend_register_constant(zend_constant *c ELS_DC)
{
char *lowercase_name = zend_strndup(c->name, c->name_len);
+31 -21
View File
@@ -4,23 +4,29 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _CONSTANTS_H
#define _CONSTANTS_H
#include "zend_globals.h"
#define CONST_CS 0x1 /* Case Sensitive */
#define CONST_PERSISTENT 0x2
typedef struct {
typedef struct _zend_constant {
zval value;
int flags;
char *name;
@@ -28,26 +34,30 @@ typedef struct {
int module_number;
} zend_constant;
#define REGISTER_LONG_CONSTANT(name,lval,flags) zend_register_long_constant((name),sizeof(name),(lval),(flags),module_number)
#define REGISTER_DOUBLE_CONSTANT(name,dval,flags) zend_register_double_constant((name),sizeof(name),(dval),(flags),module_number)
#define REGISTER_STRING_CONSTANT(name,str,flags) zend_register_string_constant((name),sizeof(name),(str),(flags),module_number)
#define REGISTER_STRINGL_CONSTANT(name,str,len,flags) zend_register_stringl_constant((name),sizeof(name),(str),(len),(flags),module_number)
#define REGISTER_LONG_CONSTANT(name,lval,flags) zend_register_long_constant((name),sizeof(name),(lval),(flags),module_number ELS_CC)
#define REGISTER_DOUBLE_CONSTANT(name,dval,flags) zend_register_double_constant((name),sizeof(name),(dval),(flags),module_number ELS_CC)
#define REGISTER_STRING_CONSTANT(name,str,flags) zend_register_string_constant((name),sizeof(name),(str),(flags),module_number ELS_CC)
#define REGISTER_STRINGL_CONSTANT(name,str,len,flags) zend_register_stringl_constant((name),sizeof(name),(str),(len),(flags),module_number ELS_CC)
#define REGISTER_MAIN_LONG_CONSTANT(name,lval,flags) zend_register_long_constant((name),sizeof(name),(lval),(flags),0)
#define REGISTER_MAIN_DOUBLE_CONSTANT(name,dval,flags) zend_register_double_constant((name),sizeof(name),(dval),(flags),0)
#define REGISTER_MAIN_STRING_CONSTANT(name,str,flags) zend_register_string_constant((name),sizeof(name),(str),(flags),0)
#define REGISTER_MAIN_STRINGL_CONSTANT(name,str,len,flags) zend_register_stringl_constant((name),sizeof(name),(str),(len),(flags),0)
#define REGISTER_MAIN_LONG_CONSTANT(name,lval,flags) zend_register_long_constant((name),sizeof(name),(lval),(flags),0 ELS_CC)
#define REGISTER_MAIN_DOUBLE_CONSTANT(name,dval,flags) zend_register_double_constant((name),sizeof(name),(dval),(flags),0 ELS_CC)
#define REGISTER_MAIN_STRING_CONSTANT(name,str,flags) zend_register_string_constant((name),sizeof(name),(str),(flags),0 ELS_CC)
#define REGISTER_MAIN_STRINGL_CONSTANT(name,str,len,flags) zend_register_stringl_constant((name),sizeof(name),(str),(len),(flags),0 ELS_CC)
void clean_module_constants(int module_number);
void free_zend_constant(zend_constant *c);
int zend_startup_constants(void);
int zend_shutdown_constants(void);
int free_zend_constant(zend_constant *c);
int zend_startup_constants(HashTable *constants ELS_DC);
int zend_shutdown_constants(ELS_D);
void zend_register_standard_constants(ELS_D);
void clean_non_persistent_constants(void);
ZEND_API int zend_get_constant(char *name, uint name_len, zval *result);
ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval, int flags, int module_number);
ZEND_API void zend_register_double_constant(char *name, uint name_len, double dval, int flags, int module_number);
ZEND_API void zend_register_string_constant(char *name, uint name_len, char *strval, int flags, int module_number);
ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *strval, uint strlen, int flags, int module_number);
ZEND_API void zend_register_constant(zend_constant *c);
ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval, int flags, int module_number ELS_DC);
ZEND_API void zend_register_double_constant(char *name, uint name_len, double dval, int flags, int module_number ELS_DC);
ZEND_API void zend_register_string_constant(char *name, uint name_len, char *strval, int flags, int module_number ELS_DC);
ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *strval, uint strlen, int flags, int module_number ELS_DC);
ZEND_API void zend_register_constant(zend_constant *c ELS_DC);
void zend_copy_constants(HashTable *target, HashTable *sourc);
#define ZEND_CONSTANT_DTOR (int (*)(void *)) free_zend_constant
#endif
+17 -13
View File
@@ -4,30 +4,34 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _ZEND_ERRORS_H
#define _ZEND_ERRORS_H
#define E_CORE_ERROR (1<<0L)
#define E_CORE_WARNING (1<<1L)
#define E_COMPILE_ERROR (1<<2L)
#define E_COMPILE_WARNING (1<<3L)
#define E_PARSE (1<<4L)
#define E_ERROR (1<<5L)
#define E_WARNING (1<<6L)
#define E_NOTICE (1<<7L)
#define E_ERROR (1<<0L)
#define E_WARNING (1<<1L)
#define E_PARSE (1<<2L)
#define E_NOTICE (1<<3L)
#define E_CORE_ERROR (1<<4L)
#define E_CORE_WARNING (1<<5L)
#define E_COMPILE_ERROR (1<<6L)
#define E_COMPILE_WARNING (1<<7L)
#define E_ALL (E_ERROR | E_WARNING | E_PARSE | E_NOTICE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING)
#define E_CORE (E_CORE_ERROR | E_CORE_WARNING)
#endif /* _ZEND_ERRORS_H */
+274 -202
View File
File diff suppressed because it is too large. Load diff
+13 -5
View File
@@ -4,23 +4,27 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _EXECUTE_H
#define _EXECUTE_H
#include "zend_compile.h"
#include "zend_hash.h"
typedef union {
typedef union _temp_variable {
zval tmp_var;
zval **var;
struct {
@@ -45,6 +49,10 @@ ZEND_API inline int i_zend_is_true(zval *op);
ZEND_API void zval_update_constant(zval *p);
ZEND_API inline void zend_assign_to_variable_reference(znode *result, zval **variable_ptr_ptr, zval **value_ptr_ptr, temp_variable *Ts ELS_DC);
/* dedicated Zend executor functions - do not use! */
ZEND_API inline void zend_ptr_stack_clear_multiple(ELS_D);
ZEND_API inline int zend_ptr_stack_get_arg(int requested_arg, void **data ELS_DC);
#if SUPPORT_INTERACTIVE
void execute_new_code(CLS_D);
#endif
+130 -69
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include <stdio.h>
#include <signal.h>
@@ -31,21 +35,32 @@
ZEND_API void (*zend_execute)(zend_op_array *op_array ELS_DC);
#if ZEND_DEBUG
static void (*original_sigsegv_handler)(int);
static void zend_handle_sigsegv(int dummy)
{
fflush(stdout);
signal(SIGSEGV, original_sigsegv_handler);
/*
printf("SIGSEGV caught on opcode %d on opline %d of %s() at %s:%d\n\n",
active_opline->opcode,
active_opline-EG(active_op_array)->opcodes,
get_active_function_name(),
zend_get_executed_filename(),
zend_get_executed_lineno());
original_sigsegv_handler(dummy);
*/
fflush(stderr);
if (original_sigsegv_handler==zend_handle_sigsegv) {
signal(SIGSEGV, original_sigsegv_handler);
} else {
signal(SIGSEGV, SIG_DFL);
}
{
ELS_FETCH();
fprintf(stderr, "SIGSEGV caught on opcode %d on opline %d of %s() at %s:%d\n\n",
active_opline->opcode,
active_opline-EG(active_op_array)->opcodes,
get_active_function_name(),
zend_get_executed_filename(ELS_C),
zend_get_executed_lineno(ELS_C));
}
if (original_sigsegv_handler!=zend_handle_sigsegv) {
original_sigsegv_handler(dummy);
}
}
#endif
static void zend_extension_activator(zend_extension *extension)
@@ -69,16 +84,23 @@ void init_executor(CLS_D ELS_DC)
var_uninit(&EG(uninitialized_zval));
var_uninit(&EG(error_zval));
EG(uninitialized_zval).refcount = 1;
EG(uninitialized_zval).is_ref=0;
EG(uninitialized_zval).EA.is_ref=0;
EG(uninitialized_zval).EA.locks = 0;
EG(uninitialized_zval_ptr)=&EG(uninitialized_zval);
EG(error_zval).refcount = 1;
EG(error_zval).is_ref=0;
EG(error_zval).EA.is_ref=0;
EG(error_zval).EA.locks = 0;
EG(error_zval_ptr)=&EG(error_zval);
zend_ptr_stack_init(&EG(function_symbol_table_stack));
zend_ptr_stack_init(&EG(arg_types_stack));
zend_stack_init(&EG(overloaded_objects_stack));
/* destroys stack frame, therefore makes core dumps worthless */
#if 0
#if ZEND_DEBUG
original_sigsegv_handler = signal(SIGSEGV, zend_handle_sigsegv);
#endif
#endif
EG(return_value) = &EG(global_return_value);
var_reset(EG(return_value));
EG(symtable_cache_ptr) = EG(symtable_cache)-1;
EG(symtable_cache_limit)=EG(symtable_cache)+SYMTABLE_CACHE_SIZE-1;
EG(no_extensions)=0;
@@ -86,31 +108,20 @@ void init_executor(CLS_D ELS_DC)
EG(function_table) = CG(function_table);
EG(class_table) = CG(class_table);
EG(AiCount) = 0;
zend_ptr_stack_init(&EG(garbage));
zend_ptr_stack_init(&EG(argument_stack));
EG(main_op_array) = NULL;
zend_hash_init(&EG(symbol_table), 50, NULL, PVAL_PTR_DTOR, 0);
EG(active_symbol_table) = &EG(symbol_table);
zend_llist_apply(&zend_extensions, (void (*)(void *)) zend_extension_activator);
/* $GLOBALS array */
{
zval *globals = (zval *) emalloc(sizeof(zval));
globals->value.ht = &EG(symbol_table);
globals->type = IS_ARRAY;
globals->refcount = 1;
globals->is_ref = 0;
zend_hash_update(&EG(symbol_table), "GLOBALS", sizeof("GLOBALS"), &globals, sizeof(zval *), NULL);
}
EG(opline_ptr) = NULL;
}
void shutdown_executor(ELS_D)
{
zend_ptr_stack_destroy(&EG(function_symbol_table_stack));
zval_dtor(EG(return_value));
zend_ptr_stack_destroy(&EG(arg_types_stack));
zend_stack_destroy(&EG(overloaded_objects_stack));
@@ -120,20 +131,27 @@ void shutdown_executor(ELS_D)
EG(symtable_cache_ptr)--;
}
zend_llist_apply(&zend_extensions, (void (*)(void *)) zend_extension_deactivator);
zend_ptr_stack_destroy(&EG(garbage));
zend_hash_destroy(&EG(symbol_table));
destroy_resource_list(); /* must be destroyed after the main symbol table is destroyed */
zend_ptr_stack_destroy(&EG(argument_stack));
if (EG(main_op_array)) {
destroy_op_array(EG(main_op_array));
efree(EG(main_op_array));
}
clean_non_persistent_constants();
#if ZEND_DEBUG
signal(SIGSEGV, original_sigsegv_handler);
#endif
}
ZEND_API char *get_active_function_name(ELS_D)
ZEND_API char *get_active_function_name()
{
ELS_FETCH();
switch(EG(function_state_ptr)->function->type) {
case ZEND_USER_FUNCTION: {
char *function_name = ((zend_op_array *) EG(function_state_ptr)->function)->function_name;
@@ -156,13 +174,21 @@ ZEND_API char *get_active_function_name(ELS_D)
ZEND_API char *zend_get_executed_filename(ELS_D)
{
return active_opline->filename;
if (EG(opline_ptr)) {
return active_opline->filename;
} else {
return "[no active file]";
}
}
ZEND_API uint zend_get_executed_lineno(ELS_D)
{
return active_opline->lineno;
if (EG(opline_ptr)) {
return active_opline->lineno;
} else {
return 0;
}
}
@@ -176,8 +202,10 @@ ZEND_API inline void safe_free_zval_ptr(zval *p)
}
ZEND_API void zval_ptr_dtor(zval **zval_ptr)
ZEND_API int zval_ptr_dtor(zval **zval_ptr)
{
int locked = PZVAL_IS_LOCKED(*zval_ptr);
#if DEBUG_ZEND>=2
printf("Reducing refcount for %x (%x): %d->%d\n", *zval_ptr, zval_ptr, (*zval_ptr)->refcount, (*zval_ptr)->refcount-1);
#endif
@@ -186,6 +214,11 @@ ZEND_API void zval_ptr_dtor(zval **zval_ptr)
zval_dtor(*zval_ptr);
safe_free_zval_ptr(*zval_ptr);
}
if (locked) {
return 0; /* don't kill the container bucket */
} else {
return 1;
}
}
@@ -244,8 +277,7 @@ ZEND_API void zval_update_constant(zval *p)
STR_FREE(p->value.str.val);
*p = c;
}
p->refcount = 1;
p->is_ref = 0;
INIT_PZVAL(p);
}
}
@@ -258,7 +290,6 @@ int call_user_function(HashTable *function_table, zval *object, zval *function_n
zend_function_state *original_function_state_ptr;
zend_op_array *original_op_array;
zend_op **original_opline_ptr;
zval *this=NULL;
CLS_FETCH();
ELS_FETCH();
@@ -267,61 +298,57 @@ int call_user_function(HashTable *function_table, zval *object, zval *function_n
return FAILURE;
}
function_table = &object->value.obj.ce->function_table;
/* unimplemented */
}
original_function_state_ptr = EG(function_state_ptr);
zend_str_tolower(function_name->value.str.val, function_name->value.str.len);
if (zend_hash_find(function_table, function_name->value.str.val, function_name->value.str.len+1, (void **) &function_state.function)==FAILURE) {
zend_error(E_ERROR, "Unknown function: %s()\n", function_name->value.str.val);
return FAILURE;
}
zend_ptr_stack_push(&EG(function_symbol_table_stack), function_state.function_symbol_table);
function_state.function_symbol_table = (HashTable *) emalloc(sizeof(HashTable));
zend_hash_init(function_state.function_symbol_table, 0, NULL, PVAL_PTR_DTOR, 0);
for (i=0; i<param_count; i++) {
zval *param;
param = (zval *) emalloc(sizeof(zval));
*param = *(params[i]);
param->refcount=1;
param->is_ref=0;
INIT_PZVAL(param);
zval_copy_ctor(param);
zend_hash_next_index_insert_ptr(function_state.function_symbol_table, param, sizeof(zval *), NULL);
//zend_hash_next_index_insert_ptr(function_state.function_symbol_table, param, sizeof(zval *), NULL);
zend_ptr_stack_push(&EG(argument_stack), param);
}
if (object) {
zval *dummy = (zval *) emalloc(sizeof(zval)), **this_ptr;
zend_ptr_stack_push(&EG(argument_stack), (void *) (long) param_count);
var_uninit(dummy);
dummy->refcount=1;
dummy->is_ref=0;
zend_hash_update_ptr(function_state.function_symbol_table, "this", sizeof("this"), dummy, sizeof(zval *), (void **) &this_ptr);
zend_assign_to_variable_reference(NULL, this_ptr, &object, NULL ELS_CC);
}
calling_symbol_table = EG(active_symbol_table);
EG(active_symbol_table) = function_state.function_symbol_table;
var_uninit(retval);
if (function_state.function->type == ZEND_USER_FUNCTION) {
calling_symbol_table = EG(active_symbol_table);
EG(active_symbol_table) = (HashTable *) emalloc(sizeof(HashTable));
zend_hash_init(EG(active_symbol_table), 0, NULL, PVAL_PTR_DTOR, 0);
if (object) {
zval *dummy = (zval *) emalloc(sizeof(zval)), **this_ptr;
var_uninit(dummy);
INIT_PZVAL(dummy);
zend_hash_update_ptr(EG(active_symbol_table), "this", sizeof("this"), dummy, sizeof(zval *), (void **) &this_ptr);
zend_assign_to_variable_reference(NULL, this_ptr, &object, NULL ELS_CC);
}
original_return_value = EG(return_value);
original_op_array = EG(active_op_array);
EG(return_value) = retval;
EG(active_op_array) = (zend_op_array *) function_state.function;
original_opline_ptr = EG(opline_ptr);
zend_execute(EG(active_op_array) ELS_CC);
zend_hash_destroy(EG(active_symbol_table));
efree(EG(active_symbol_table));
EG(active_symbol_table) = calling_symbol_table;
EG(active_op_array) = original_op_array;
EG(return_value)=original_return_value;
EG(opline_ptr) = original_opline_ptr;
} else {
((zend_internal_function *) function_state.function)->handler(EG(active_symbol_table), retval, &EG(regular_list), &EG(persistent_list));
((zend_internal_function *) function_state.function)->handler(param_count, retval, &EG(regular_list), &EG(persistent_list), object);
}
zend_hash_destroy(EG(active_symbol_table));
efree(EG(active_symbol_table));
EG(active_symbol_table) = calling_symbol_table;
zend_ptr_stack_clear_multiple(ELS_C);
EG(function_state_ptr) = original_function_state_ptr;
function_state.function_symbol_table = zend_ptr_stack_pop(&EG(function_symbol_table_stack));
return SUCCESS;
}
@@ -395,14 +422,14 @@ ZEND_API inline void zend_assign_to_variable_reference(znode *result, zval **var
value_ptr = *value_ptr_ptr;
if (variable_ptr == EG(error_zval_ptr) || value_ptr==EG(error_zval_ptr)) {
variable_ptr_ptr = &EG(uninitialized_zval_ptr);
} else if (variable_ptr!=value_ptr) {
} else if (variable_ptr==&EG(uninitialized_zval) || variable_ptr!=value_ptr) {
variable_ptr->refcount--;
if (variable_ptr->refcount==0) {
zendi_zval_dtor(*variable_ptr);
efree(variable_ptr);
}
if (!value_ptr->is_ref) {
if (!PZVAL_IS_REF(value_ptr)) {
/* break it away */
value_ptr->refcount--;
if (value_ptr->refcount>0) {
@@ -411,8 +438,9 @@ ZEND_API inline void zend_assign_to_variable_reference(znode *result, zval **var
value_ptr = *value_ptr_ptr;
zendi_zval_copy_ctor(*value_ptr);
}
value_ptr->refcount=1;
value_ptr->is_ref=1;
value_ptr->refcount = 1;
value_ptr->EA.is_ref = 1;
value_ptr->EA.locks = 0;
}
*variable_ptr_ptr = value_ptr;
@@ -423,6 +451,7 @@ ZEND_API inline void zend_assign_to_variable_reference(znode *result, zval **var
if (result && (result->op_type != IS_UNUSED)) {
Ts[result->u.var].var = variable_ptr_ptr;
PZVAL_LOCK(*variable_ptr_ptr);
}
}
@@ -433,8 +462,9 @@ void execute_new_code(CLS_D)
ELS_FETCH();
if (!EG(interactive)
|| CG(active_op_array)->backpatch_count>0) {
|| CG(active_op_array)->backpatch_count>0
|| CG(active_op_array)->function_name
|| CG(active_op_array)->type!=ZEND_USER_FUNCTION) {
return;
}
CG(active_op_array)->start_op_number = CG(active_op_array)->last_executed_op_number;
@@ -444,3 +474,34 @@ void execute_new_code(CLS_D)
CG(active_op_array)->start_op_number = CG(active_op_array)->last_executed_op_number;
}
#endif
/* these are a dedicated, optimized, function, and shouldn't be used for any purpose
* other than by Zend's executor
*/
ZEND_API inline void zend_ptr_stack_clear_multiple(ELS_D)
{
void **p = EG(argument_stack).top_element-1;
int delete_count = (ulong) *p;
EG(argument_stack).top -= (delete_count+1);
while (--delete_count>=0) {
zval_ptr_dtor((zval **) --p);
}
EG(argument_stack).top_element = p;
}
ZEND_API int zend_ptr_stack_get_arg(int requested_arg, void **data ELS_DC)
{
void **p = EG(argument_stack).top_element-1;
int arg_count = (ulong) *p;
if (requested_arg>arg_count) {
return FAILURE;
}
*data = (p-arg_count+requested_arg-1);
return SUCCESS;
}
+50 -16
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include "zend_extensions.h"
ZEND_API zend_llist zend_extensions;
@@ -45,68 +49,98 @@ int zend_load_extension(char *path)
handle = DL_LOAD(path);
if (!handle) {
zend_printf("Failed loading %s\n", path);
#if !(WIN32||WINNT)
fprintf(stderr, "Failed loading %s: %s\n", path, dlerror());
#else
fprintf(stderr, "Failed loading %s\n", path);
#endif
return FAILURE;
}
extension_version_info = (zend_extension_version_info *) DL_FETCH_SYMBOL(handle, "extension_version_info");
new_extension = (zend_extension *) DL_FETCH_SYMBOL(handle, "zend_extension_entry");
if (!extension_version_info || !new_extension) {
zend_printf("%s doesn't appear to be a valid Zend extension\n", path);
fprintf(stderr, "%s doesn't appear to be a valid Zend extension\n", path);
return FAILURE;
}
if (extension_version_info->zend_extension_api_no > ZEND_EXTENSION_API_NO) {
zend_printf("%s requires Zend version %s or later\n"
fprintf(stderr, "%s requires Zend version %s or later\n"
"Current version %s, API version %d\n",
new_extension->name,
extension_version_info->required_zend_version,
ZEND_VERSION,
ZEND_EXTENSION_API_NO);
DL_UNLOAD(handle);
return FAILURE;
} else if (extension_version_info->zend_extension_api_no < ZEND_EXTENSION_API_NO) {
/* we may be able to allow for downwards compatability in some harmless cases. */
zend_printf("%s is outdated (API version %d, current version %d)\n"
fprintf(stderr, "%s is outdated (API version %d, current version %d)\n"
"Contact %s at %s for a later version of this module.\n",
new_extension->name,
extension_version_info->zend_extension_api_no,
ZEND_EXTENSION_API_NO,
new_extension->author,
new_extension->URL);
DL_UNLOAD(handle);
return FAILURE;
} else if (ZTS_V!=extension_version_info->thread_safe) {
zend_printf("Cannot load %s - it %s thread safe, whereas Zend %s\n",
fprintf(stderr, "Cannot load %s - it %s thread safe, whereas Zend %s\n",
new_extension->name,
(extension_version_info->thread_safe?"is":"isn't"),
(ZTS_V?"is":"isn't"));
DL_UNLOAD(handle);
return FAILURE;
} else if (ZEND_DEBUG_V!=extension_version_info->debug) {
fprintf(stderr, "Cannot load %s - it %s debug information, whereas Zend %s\n",
new_extension->name,
(extension_version_info->debug?"contains":"does not contain"),
(ZEND_DEBUG_V?"does":"does not"));
DL_UNLOAD(handle);
return FAILURE;
}
if (new_extension->startup) {
new_extension->startup(new_extension);
if (new_extension->startup(new_extension)!=SUCCESS) {
DL_UNLOAD(handle);
return FAILURE;
}
}
extension = *new_extension;
extension.handle = handle;
zend_llist_add_element(&zend_extensions, &extension);
/*zend_printf("Loaded %s, version %s\n", extension.name, extension.version);*/
/*fprintf(stderr, "Loaded %s, version %s\n", extension.name, extension.version);*/
zend_append_version_info(&extension);
return SUCCESS;
#else
zend_printf("Extensions are not supported on this platform.\n");
return FAILURE
fprintf(stderr, "Extensions are not supported on this platform.\n");
return FAILURE;
#endif
}
static void zend_extension_shutdown(zend_extension *extension)
{
#if ZEND_EXTENSIONS_SUPPORT
if (extension->shutdown) {
extension->shutdown(extension);
}
#endif
}
void zend_shutdown_extensions()
{
zend_llist_apply(&zend_extensions, (void (*)(void *)) zend_extension_shutdown);
zend_llist_destroy(&zend_extensions);
}
void zend_extension_dtor(zend_extension *extension)
{
#if ZEND_EXTENSIONS_SUPPORT
if (extension->shutdown) {
extension->shutdown(extension);
}
DL_UNLOAD(extension->handle);
#endif
}
+20 -8
View File
@@ -4,27 +4,32 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _ZEND_EXTENSIONS_H
#define _ZEND_EXTENSIONS_H
#include "zend_compile.h"
#define ZEND_EXTENSION_API_NO 2
#define ZEND_EXTENSION_API_NO 19990619
typedef struct {
typedef struct _zend_extension_version_info {
int zend_extension_api_no;
char *required_zend_version;
unsigned char thread_safe;
unsigned char debug;
} zend_extension_version_info;
@@ -37,7 +42,7 @@ struct _zend_extension {
char *URL;
char *copyright;
void (*startup)(zend_extension *extension);
int (*startup)(zend_extension *extension);
void (*shutdown)(zend_extension *extension);
void (*activate)();
void (*deactivate)();
@@ -73,9 +78,15 @@ ZEND_API int zend_get_resource_handle();
#define ZTS_V 0
#endif
#ifdef ZEND_DEBUG
#define ZEND_DEBUG_V 1
#else
#define ZEND_DEBUG_V 0
#endif
#define ZEND_EXTENSION() \
ZEND_EXT_API zend_extension_version_info extension_version_info = { ZEND_EXTENSION_API_NO, "0.80A", ZTS_V }
ZEND_EXT_API zend_extension_version_info extension_version_info = { ZEND_EXTENSION_API_NO, "0.90", ZTS_V, ZEND_DEBUG_V }
#define STANDARD_ZEND_EXTENSION_PROPERTIES NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, -1
@@ -86,5 +97,6 @@ void zend_extension_dtor(zend_extension *extension);
int zend_load_extension(char *path);
int zend_load_extensions(char **extension_paths);
void zend_append_version_info(zend_extension *extension);
void zend_shutdown_extensions();
#endif /* _ZEND_EXTENSIONS_H */
+49 -25
View File
@@ -4,18 +4,22 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _ZEND_GLOBALS_H
#define _ZEND_GLOBALS_H
#ifndef _T_GLOBALS_H
#define _T_GLOBALS_H
#include <setjmp.h>
@@ -24,13 +28,22 @@
#include "zend_hash.h"
#include "zend_llist.h"
#undef ZTS
/* Define ZTS if you want a thread-safe Zend */
/*#undef ZTS*/
#ifdef ZTS
#include "SAPI.h"
#include "../TSRM/TSRM.h"
#ifdef __cplusplus
class ZendFlexLexer;
#endif
BEGIN_EXTERN_C()
ZEND_API extern int compiler_globals_id;
ZEND_API extern int executor_globals_id;
extern int alloc_globals_id;
END_EXTERN_C()
extern int compiler_globals_id;
extern int executor_globals_id;
#endif
typedef struct _zend_compiler_globals zend_compiler_globals;
@@ -47,10 +60,12 @@ typedef struct _zend_alloc_globals zend_alloc_globals;
# define CLS_C compiler_globals
# define CLS_CC , CLS_C
# define CG(v) (((zend_compiler_globals *) compiler_globals)->v)
# define CLS_FETCH() zend_compiler_globals *compiler_globals = ts_resource(compiler_globals_id)
# define CLS_FETCH() zend_compiler_globals *compiler_globals = (zend_compiler_globals *) ts_resource(compiler_globals_id)
# define YYPARSE_PARAM compiler_globals
# define YYLEX_PARAM compiler_globals
BEGIN_EXTERN_C()
int zendparse(void *compiler_globals);
END_EXTERN_C()
#else
# define CLS_D
# define CLS_DC
@@ -70,7 +85,7 @@ int zendparse();
# define ELS_C executor_globals
# define ELS_CC , ELS_C
# define EG(v) (executor_globals->v)
# define ELS_FETCH() zend_executor_globals *executor_globals = ts_resource(executor_globals_id)
# define ELS_FETCH() zend_executor_globals *executor_globals = (zend_executor_globals *) ts_resource(executor_globals_id)
#else
# define ELS_D
# define ELS_DC
@@ -89,7 +104,7 @@ extern ZEND_API zend_executor_globals executor_globals;
# define ALS_C alloc_globals
# define ALS_CC , ALS_C
# define AG(v) (((zend_alloc_globals *) alloc_globals)->v)
# define ALS_FETCH() zend_alloc_globals *alloc_globals = ts_resource(alloc_globals_id)
# define ALS_FETCH() zend_alloc_globals *alloc_globals = (zend_alloc_globals *) ts_resource(alloc_globals_id)
#else
# define ALS_D
# define ALS_DC
@@ -99,7 +114,6 @@ extern ZEND_API zend_executor_globals executor_globals;
# define ALS_FETCH()
#endif
#include "zend_compile.h"
#include "zend_execute.h"
@@ -129,12 +143,23 @@ struct _zend_compiler_globals {
zend_llist filenames_list;
unsigned char short_tags;
unsigned char asp_tags;
zend_bool short_tags;
zend_bool asp_tags;
/* For extensions support */
unsigned char extended_info; /* generate extension information for debugger/profiler */
unsigned char handle_op_arrays; /* run op_arrays through op_array handlers */
zend_bool extended_info; /* generate extension information for debugger/profiler */
zend_bool handle_op_arrays; /* run op_arrays through op_array handlers */
zend_bool unclean_shutdown;
zend_llist open_files;
#ifdef ZTS
#ifdef __cplusplus
ZendFlexLexer *ZFL;
#else
void *ZFL;
#endif
#endif
};
@@ -148,7 +173,6 @@ struct _zend_executor_globals {
zval *error_zval_ptr;
zend_function_state *function_state_ptr;
zend_ptr_stack function_symbol_table_stack;
zend_ptr_stack arg_types_stack;
zend_stack overloaded_objects_stack;
zval global_return_value;
@@ -176,16 +200,15 @@ struct _zend_executor_globals {
long precision;
unsigned int AiCount;
zend_ptr_stack garbage;
/* for extended information support */
unsigned char no_extensions;
HashTable regular_list;
HashTable persistent_list;
zend_ptr_stack argument_stack;
void *reserved[4];
#if SUPPORT_INTERACTIVE
int interactive;
#endif
@@ -199,11 +222,12 @@ struct _zend_alloc_globals {
void *cache[MAX_CACHED_MEMORY][MAX_CACHED_ENTRIES];
unsigned char cache_count[MAX_CACHED_MEMORY];
# if MEMORY_LIMIT
#if MEMORY_LIMIT
unsigned int memory_limit;
unsigned int allocated_memory;
unsigned char memory_exhausted;
#endif
};
#endif /* _ZEND_GLOBALS_H */
#endif /* _T_GLOBALS_H */
+45 -15
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
@@ -71,7 +75,7 @@ ZEND_API ulong hashpjw(char *arKey, uint nKeyLength)
}
ZEND_API int zend_hash_init(HashTable *ht, uint nSize, ulong(*pHashFunction) (char *arKey, uint nKeyLength), void (*pDestructor) (void *pData),int persistent)
ZEND_API int zend_hash_init(HashTable *ht, uint nSize, ulong(*pHashFunction) (char *arKey, uint nKeyLength), int (*pDestructor) (void *pData),int persistent)
{
uint i;
@@ -631,7 +635,7 @@ static int if_full_do_resize(HashTable *ht)
if ((ht->nNumOfElements > ht->nTableSize) && (ht->nHashSizeIndex < nNumPrimeNumbers - 1)) { /* Let's double the table
size */
t = (Bucket **) perealloc(ht->arBuckets, PrimeNumbers[ht->nHashSizeIndex + 1] * sizeof(Bucket *),ht->persistent);
t = (Bucket **) perealloc_recoverable(ht->arBuckets, PrimeNumbers[ht->nHashSizeIndex + 1] * sizeof(Bucket *),ht->persistent);
if (t) {
HANDLE_BLOCK_INTERRUPTIONS();
ht->arBuckets = t;
@@ -720,6 +724,7 @@ ZEND_API int zend_hash_del_key_or_index(HashTable *ht, char *arKey, uint nKeyLen
ZEND_API void zend_hash_destroy(HashTable *ht)
{
Bucket *p, *q;
int delete_bucket;
p = ht->pListHead;
while (p != NULL) {
@@ -727,13 +732,22 @@ ZEND_API void zend_hash_destroy(HashTable *ht)
p = p->pListNext;
if (!q->bIsPointer) {
if (ht->pDestructor) {
ht->pDestructor(q->pData);
delete_bucket = ht->pDestructor(q->pData);
} else {
delete_bucket = 1;
}
if (!q->pDataPtr && q->pData) {
if (!q->pDataPtr && q->pData && delete_bucket) {
pefree(q->pData,ht->persistent);
}
} else {
delete_bucket = 1;
}
if (delete_bucket) {
pefree(q,ht->persistent);
} else {
int i;
i=2;
}
pefree(q,ht->persistent);
}
pefree(ht->arBuckets,ht->persistent);
}
@@ -779,7 +793,7 @@ ZEND_API void zend_hash_apply(HashTable *ht,int (*destruct) (void *))
q = p;
p = p->pListNext;
if (destruct(q->pData)) {
if (q->arKey == NULL) {
if (q->nKeyLength==0) {
zend_hash_index_del(ht, q->h);
} else {
zend_hash_del(ht,q->arKey,q->nKeyLength);
@@ -798,7 +812,7 @@ ZEND_API void zend_hash_apply_with_argument(HashTable *ht,int (*destruct) (void
q = p;
p = p->pListNext;
if (destruct(q->pData, argument)) {
if (q->arKey == NULL) {
if (q->nKeyLength == 0) {
zend_hash_index_del(ht, q->h);
} else {
zend_hash_del(ht,q->arKey,q->nKeyLength);
@@ -829,20 +843,21 @@ ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, void (*pCopyC
}
ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size)
ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size, int overwrite)
{
Bucket *p;
void *t;
int mode = (overwrite?HASH_UPDATE:HASH_ADD);
p = source->pListHead;
while (p) {
memcpy(tmp, p->pData, size);
if (p->arKey) {
if (zend_hash_add(target, p->arKey, p->nKeyLength, tmp, size, &t)==SUCCESS && pCopyConstructor) {
if (p->nKeyLength>0) {
if (zend_hash_add_or_update(target, p->arKey, p->nKeyLength, tmp, size, &t, mode)==SUCCESS && pCopyConstructor) {
pCopyConstructor(t);
}
} else {
if (!zend_hash_index_exists(target, p->h) && zend_hash_index_update(target, p->h, tmp, size, &t)==SUCCESS && pCopyConstructor) {
if ((mode==HASH_UPDATE || !zend_hash_index_exists(target, p->h)) && zend_hash_index_update(target, p->h, tmp, size, &t)==SUCCESS && pCopyConstructor) {
pCopyConstructor(t);
}
}
@@ -1024,6 +1039,21 @@ ZEND_API int zend_hash_get_current_key(HashTable *ht, char **str_index, ulong *n
}
ZEND_API int zend_hash_get_current_key_type(HashTable *ht)
{
Bucket *p = ht->pInternalPointer;
if (p) {
if (p->nKeyLength) {
return HASH_KEY_IS_STRING;
} else {
return HASH_KEY_IS_LONG;
}
}
return HASH_KEY_NON_EXISTANT;
}
ZEND_API int zend_hash_get_current_data(HashTable *ht, void **pData)
{
Bucket *p = ht->pInternalPointer;
+15 -8
View File
@@ -4,17 +4,19 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _HASH_
#define _HASH_
@@ -56,13 +58,15 @@ typedef struct hashtable {
Bucket *pListHead;
Bucket *pListTail;
Bucket **arBuckets;
void (*pDestructor) (void *pData);
int (*pDestructor) (void *pData);
unsigned char persistent;
} HashTable;
BEGIN_EXTERN_C()
/* startup/shutdown */
ZEND_API int zend_hash_init(HashTable *ht, uint nSize, ulong(*pHashFunction) (char *arKey, uint nKeyLength), void (*pDestructor) (void *pData), int persistent);
ZEND_API int zend_hash_init(HashTable *ht, uint nSize, ulong(*pHashFunction) (char *arKey, uint nKeyLength), int (*pDestructor) (void *pData), int persistent);
ZEND_API void zend_hash_destroy(HashTable *ht);
ZEND_API void zend_hash_clean(HashTable *ht);
@@ -129,13 +133,14 @@ ZEND_API ulong zend_hash_next_free_element(HashTable *ht);
ZEND_API void zend_hash_move_forward(HashTable *ht);
ZEND_API void zend_hash_move_backwards(HashTable *ht);
ZEND_API int zend_hash_get_current_key(HashTable *ht, char **str_index, ulong *num_index);
ZEND_API int zend_hash_get_current_key_type(HashTable *ht);
ZEND_API int zend_hash_get_current_data(HashTable *ht, void **pData);
ZEND_API void zend_hash_internal_pointer_reset(HashTable *ht);
ZEND_API void zend_hash_internal_pointer_end(HashTable *ht);
/* Copying, merging and sorting */
ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size);
ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size);
ZEND_API void zend_hash_merge(HashTable *target, HashTable *source, void (*pCopyConstructor) (void *pData), void *tmp, uint size, int overwrite);
ZEND_API int zend_hash_sort(HashTable *ht, int (*compar) (const void *, const void *), int renumber);
ZEND_API int zend_hash_minmax(HashTable *ht, int (*compar) (const void *, const void *), int flag, void **pData);
@@ -150,4 +155,6 @@ void zend_hash_display_pListTail(HashTable *ht);
void zend_hash_display(HashTable *ht);
#endif
END_EXTERN_C()
#endif /* _HASH_ */
+27 -20
View File
@@ -4,25 +4,33 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include "zend.h"
#include "zend_compile.h"
#include "zend_highlight.h"
#include "zend_ptr_stack.h"
#include "zend_globals.h"
#ifndef ZTS
extern char *zendtext;
extern int zendleng;
#else
#define zendtext ((char *) zend_get_zendtext(CLS_C))
#define zendleng zend_get_zendleng(CLS_C)
#endif
static void html_putc(char c)
{
@@ -63,8 +71,7 @@ static void html_puts(char *s, uint len)
void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini)
ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini)
{
zval token;
int token_type;
@@ -78,19 +85,19 @@ void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini)
token.type = 0;
while ((token_type=lex_scan(&token CLS_CC))) {
switch (token_type) {
case INLINE_HTML:
case T_INLINE_HTML:
next_color = syntax_highlighter_ini->highlight_html;
break;
case ZEND_COMMENT:
case T_COMMENT:
next_color = syntax_highlighter_ini->highlight_comment;
break;
case PHP_OPEN_TAG:
case T_OPEN_TAG:
next_color = syntax_highlighter_ini->highlight_default;
break;
case PHP_CLOSE_TAG:
case T_CLOSE_TAG:
next_color = syntax_highlighter_ini->highlight_default;
break;
case CONSTANT_ENCAPSED_STRING:
case T_CONSTANT_ENCAPSED_STRING:
next_color = syntax_highlighter_ini->highlight_string;
break;
case '"':
@@ -125,7 +132,7 @@ void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini)
}
}
switch (token_type) {
case DOLLAR_OPEN_CURLY_BRACES:
case T_DOLLAR_OPEN_CURLY_BRACES:
html_puts("{", 1);
break;
default:
@@ -135,13 +142,13 @@ void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini)
if (token.type == IS_STRING) {
switch (token_type) {
case PHP_OPEN_TAG:
case PHP_CLOSE_TAG:
case T_WHITESPACE:
break;
default:
efree(token.value.str.val);
break;
case T_OPEN_TAG:
case T_CLOSE_TAG:
case T_WHITESPACE:
break;
default:
efree(token.value.str.val);
break;
}
}
token.type = 0;
+12 -6
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _HIGHLIGHT_H
#define _HIGHLIGHT_H
@@ -25,7 +29,7 @@
#define HL_KEYWORD_COLOR "#007700" /* green */
typedef struct {
typedef struct _zend_syntax_highlighter_ini {
char *highlight_html;
char *highlight_comment;
char *highlight_default;
@@ -33,10 +37,12 @@ typedef struct {
char *highlight_keyword;
} zend_syntax_highlighter_ini;
void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini);
BEGIN_EXTERN_C()
ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini);
int highlight_file(char *filename, zend_syntax_highlighter_ini *syntax_highlighter_ini);
int highlight_string(zval *str, zend_syntax_highlighter_ini *syntax_highlighter_ini);
END_EXTERN_C()
extern zend_syntax_highlighter_ini syntax_highlighter_ini;
+19 -9
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
/* This indenter doesn't really work, it's here for no particular reason. */
@@ -21,8 +25,14 @@
#include "zend_compile.h"
#include "zend_indent.h"
#ifndef ZTS
extern char *zendtext;
extern int zendleng;
#else
#define zendtext ((char *) zend_get_zendtext(CLS_C))
#define zendleng zend_get_zendleng(CLS_C)
#endif
static void handle_whitespace(int *emit_whitespace)
{
@@ -32,7 +42,7 @@ static void handle_whitespace(int *emit_whitespace)
for (c=0; c<128; c++) {
if (emit_whitespace[c]>0) {
for (i=0; i<emit_whitespace[c]; i++) {
zend_write(&c, 1);
zend_write((char *) &c, 1);
}
}
}
@@ -40,7 +50,7 @@ static void handle_whitespace(int *emit_whitespace)
}
void zend_indent()
ZEND_API void zend_indent()
{
zval token;
int token_type;
@@ -56,7 +66,7 @@ void zend_indent()
token.type = 0;
while ((token_type=lex_scan(&token CLS_CC))) {
switch (token_type) {
case INLINE_HTML:
case T_INLINE_HTML:
zend_write(zendtext, zendleng);
break;
case T_WHITESPACE: {
@@ -127,8 +137,8 @@ dflt_printout:
}
if (token.type == IS_STRING) {
switch (token_type) {
case PHP_OPEN_TAG:
case PHP_CLOSE_TAG:
case T_OPEN_TAG:
case T_CLOSE_TAG:
case T_WHITESPACE:
break;
default:
+9 -5
View File
@@ -4,19 +4,23 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _ZEND_INDENT_H
#define _ZEND_INDENT_H
void zend_indent();
ZEND_API void zend_indent();
#endif /* _ZEND_INDENT_H */
+30 -40
View File
@@ -4,36 +4,27 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include "zend.h"
#include "zend_list.h"
#include "zend_API.h"
#include "zend_globals.h"
#if 0
#if HAVE_DIRENT_H
#include <dirent.h>
#endif
#if MSVC5
#if !(APACHE)
#define NEEDRDH 1
#endif
#include "win32/readdir.h"
#endif
#endif
int le_index_ptr;
ZEND_API int le_index_ptr;
static inline int zend_list_do_insert(HashTable *list,void *ptr, int type)
{
@@ -83,7 +74,7 @@ static inline void *zend_list_do_find(HashTable *list,int id, int *type)
}
int zend_list_insert(void *ptr, int type)
ZEND_API int zend_list_insert(void *ptr, int type)
{
ELS_FETCH();
@@ -91,7 +82,7 @@ int zend_list_insert(void *ptr, int type)
}
int zend_plist_insert(void *ptr, int type)
ZEND_API int zend_plist_insert(void *ptr, int type)
{
ELS_FETCH();
@@ -99,15 +90,7 @@ int zend_plist_insert(void *ptr, int type)
}
int zend_list_delete(int id)
{
ELS_FETCH();
return zend_list_do_delete(&EG(regular_list), id);
}
int zend_list_addref(int id)
ZEND_API int zend_list_addref(int id)
{
list_entry *le;
ELS_FETCH();
@@ -121,7 +104,16 @@ int zend_list_addref(int id)
}
}
int zend_plist_delete(int id)
ZEND_API int zend_list_delete(int id)
{
ELS_FETCH();
return zend_list_do_delete(&EG(regular_list), id);
}
ZEND_API int zend_plist_delete(int id)
{
ELS_FETCH();
@@ -129,7 +121,7 @@ int zend_plist_delete(int id)
}
void *zend_list_find(int id, int *type)
ZEND_API void *zend_list_find(int id, int *type)
{
ELS_FETCH();
@@ -137,7 +129,7 @@ void *zend_list_find(int id, int *type)
}
void *zend_plist_find(int id, int *type)
ZEND_API void *zend_plist_find(int id, int *type)
{
ELS_FETCH();
@@ -145,7 +137,7 @@ void *zend_plist_find(int id, int *type)
}
void list_entry_destructor(void *ptr)
int list_entry_destructor(void *ptr)
{
list_entry *le = (list_entry *) ptr;
list_destructors_entry *ld;
@@ -157,10 +149,11 @@ void list_entry_destructor(void *ptr)
} else {
zend_error(E_WARNING,"Unknown list entry type in request shutdown (%d)",le->type);
}
return 1;
}
void plist_entry_destructor(void *ptr)
int plist_entry_destructor(void *ptr)
{
list_entry *le = (list_entry *) ptr;
list_destructors_entry *ld;
@@ -172,21 +165,18 @@ void plist_entry_destructor(void *ptr)
} else {
zend_error(E_WARNING,"Unknown persistent list entry type in module shutdown (%d)",le->type);
}
return 1;
}
int init_resource_list(void)
int init_resource_list(ELS_D)
{
ELS_FETCH();
return zend_hash_init(&EG(regular_list), 0, NULL, list_entry_destructor, 0);
}
int init_resource_plist(void)
int init_resource_plist(ELS_D)
{
ELS_FETCH();
return zend_hash_init(&EG(persistent_list), 0, NULL, plist_entry_destructor, 1);
}
+24 -17
View File
@@ -4,30 +4,35 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _LIST_H
#define _LIST_H
#include "zend_hash.h"
#include "zend_globals.h"
extern HashTable list_destructors;
typedef struct {
typedef struct _list_entry {
void *ptr;
int type;
int refcount;
} list_entry;
typedef struct {
typedef struct _list_destructors_entry {
void (*list_destructor)(void *);
void (*plist_destructor)(void *);
int module_number;
@@ -41,21 +46,23 @@ enum list_entry_type {
LE_DB=1000
};
void list_entry_destructor(void *ptr);
void plist_entry_destructor(void *ptr);
int list_entry_destructor(void *ptr);
int plist_entry_destructor(void *ptr);
int clean_module_resource_destructors(list_destructors_entry *ld, int *module_number);
int init_resource_list(void);
int init_resource_plist(void);
int init_resource_list(ELS_D);
int init_resource_plist(ELS_D);
void destroy_resource_list(void);
void destroy_resource_plist(void);
int zend_list_insert(void *ptr, int type);
int zend_plist_insert(void *ptr, int type);
int zend_list_addref(int id);
int zend_list_delete(int id);
int zend_plist_delete(int id);
void *zend_list_find(int id, int *type);
void *zend_plist_find(int id, int *type);
ZEND_API int zend_list_insert(void *ptr, int type);
ZEND_API int zend_plist_insert(void *ptr, int type);
ZEND_API int zend_list_addref(int id);
ZEND_API int zend_list_delete(int id);
ZEND_API int zend_plist_delete(int id);
ZEND_API void *zend_list_find(int id, int *type);
ZEND_API void *zend_plist_find(int id, int *type);
extern ZEND_API int le_index_ptr; /* list entry type for index pointers */
#endif
+34 -6
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include "zend.h"
#include "zend_llist.h"
@@ -43,12 +47,28 @@ ZEND_API void zend_llist_add_element(zend_llist *l, void *element)
}
ZEND_API void zend_llist_prepend_element(zend_llist *l, void *element)
{
zend_llist_element *tmp = pemalloc(sizeof(zend_llist_element)+l->size-1, l->persistent);
tmp->next = l->head;
tmp->prev = NULL;
if (l->head) {
l->head->prev = tmp;
} else {
l->tail = tmp;
}
l->head = tmp;
memcpy(tmp->data, element, l->size);
}
ZEND_API void zend_llist_del_element(zend_llist *l, void *element)
{
zend_llist_element *current=l->head;
while (current) {
if (current->data == element) {
if (!memcmp(current->data, element, l->size)) {
if (current->prev) {
current->prev->next = current->next;
} else {
@@ -73,7 +93,7 @@ ZEND_API void zend_llist_del_element(zend_llist *l, void *element)
ZEND_API void zend_llist_destroy(zend_llist *l)
{
zend_llist_element *current=l->head, *next;
while (current) {
next = current->next;
if (l->dtor) {
@@ -84,6 +104,14 @@ ZEND_API void zend_llist_destroy(zend_llist *l)
}
}
ZEND_API void zend_llist_clean(zend_llist *l)
{
zend_llist_destroy(l);
l->head = l->tail = NULL;
}
ZEND_API void zend_llist_remove_tail(zend_llist *l)
{
zend_llist_element *old_tail;
+13 -5
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _ZEND_LLIST_H
#define _ZEND_LLIST_H
@@ -25,7 +29,7 @@ typedef struct _zend_llist_element {
char data[1]; /* Needs to always be last in the struct */
} zend_llist_element;
typedef struct {
typedef struct _zend_llist {
zend_llist_element *head;
zend_llist_element *tail;
size_t size;
@@ -34,10 +38,13 @@ typedef struct {
zend_llist_element *traverse_ptr;
} zend_llist;
BEGIN_EXTERN_C()
ZEND_API void zend_llist_init(zend_llist *l, size_t size, void (*dtor)(void *data), unsigned char persistent);
ZEND_API void zend_llist_add_element(zend_llist *l, void *element);
ZEND_API void zend_llist_prepend_element(zend_llist *l, void *element);
ZEND_API void zend_llist_del_element(zend_llist *l, void *element);
ZEND_API void zend_llist_destroy(zend_llist *l);
ZEND_API void zend_llist_clean(zend_llist *l);
ZEND_API void zend_llist_remove_tail(zend_llist *l);
ZEND_API void zend_llist_copy(zend_llist *dst, zend_llist *src);
ZEND_API void zend_llist_apply(zend_llist *l, void (*func)(void *data));
@@ -49,5 +56,6 @@ ZEND_API void *zend_llist_get_first(zend_llist *l);
ZEND_API void *zend_llist_get_last(zend_llist *l);
ZEND_API void *zend_llist_get_next(zend_llist *l);
ZEND_API void *zend_llist_get_prev(zend_llist *l);
END_EXTERN_C()
#endif /* _ZEND_LLIST_H */
+23 -16
View File
@@ -4,44 +4,50 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _MODULES_H
#define _MODULES_H
#define INIT_FUNC_ARGS int type, int module_number
#define INIT_FUNC_ARGS int type, int module_number
#define INIT_FUNC_ARGS_PASSTHRU type, module_number
#define SHUTDOWN_FUNC_ARGS int type, int module_number
#define SHUTDOWN_FUNC_ARGS_PASSTHRU type, module_number
#define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module
#ifdef HAS_ZEND_INI_ENTRIES
#define STANDARD_MODULE_PROPERTIES 0, 0, 0, NULL, 0
#else
#define STANDARD_MODULE_PROPERTIES 0, 0, 0, NULL, 0
#endif
#define MODULE_PERSISTENT 1
#define MODULE_TEMPORARY 2
typedef struct {
typedef struct _zend_module_entry zend_module_entry;
struct _zend_module_entry {
char *name;
function_entry *functions;
zend_function_entry *functions;
int (*module_startup_func)(INIT_FUNC_ARGS);
int (*module_shutdown_func)(void);
int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS);
int (*request_startup_func)(INIT_FUNC_ARGS);
int (*request_shutdown_func)(void);
void (*info_func)(void);
int request_started,module_started;
int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS);
void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS);
int request_started, module_started;
unsigned char type;
void *handle;
int module_number;
} zend_module_entry;
};
extern HashTable module_registry;
@@ -50,4 +56,5 @@ extern void module_destructor(zend_module_entry *module);
extern int module_registry_cleanup(zend_module_entry *module);
extern int module_registry_request_startup(zend_module_entry *module);
#define ZEND_MODULE_DTOR (int (*)(void *)) module_destructor
#endif
+47 -24
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include <stdio.h>
#include "zend.h"
@@ -24,6 +28,7 @@
#include "zend_extensions.h"
#include "zend_API.h"
static void zend_extension_op_array_ctor_handler(zend_extension *extension, zend_op_array *op_array)
{
if (extension->op_array_ctor) {
@@ -59,15 +64,17 @@ void init_op_array(zend_op_array *op_array, int initial_ops_size)
{
op_array->type = ZEND_USER_FUNCTION;
#if SUPPORT_INTERACTIVE
CLS_FETCH();
{
ELS_FETCH();
op_array->start_op_number = op_array->end_op_number = op_array->last_executed_op_number = 0;
op_array->backpatch_count = 0;
if (EG(interactive)) {
/* We must avoid a realloc() on the op_array in interactive mode, since pointers to constants
* will become invalid
*/
initial_ops_size = 8192;
op_array->start_op_number = op_array->end_op_number = op_array->last_executed_op_number = 0;
op_array->backpatch_count = 0;
if (EG(interactive)) {
/* We must avoid a realloc() on the op_array in interactive mode, since pointers to constants
* will become invalid
*/
initial_ops_size = 8192;
}
}
#endif
@@ -90,11 +97,13 @@ void init_op_array(zend_op_array *op_array, int initial_ops_size)
op_array->static_variables = NULL;
op_array->uses_globals = 0;
zend_llist_apply_with_argument(&zend_extensions, (void (*)(void *, void *)) zend_extension_op_array_ctor_handler, op_array);
}
void destroy_zend_function(zend_function *function)
ZEND_API int destroy_zend_function(zend_function *function)
{
switch (function->type) {
case ZEND_USER_FUNCTION:
@@ -104,22 +113,36 @@ void destroy_zend_function(zend_function *function)
/* do nothing */
break;
}
return 1;
}
void destroy_zend_class(zend_class_entry *ce)
ZEND_API int destroy_zend_class(zend_class_entry *ce)
{
if (--(*ce->refcount)>0) {
return 1;
}
switch (ce->type) {
case ZEND_USER_CLASS:
efree(ce->name);
efree(ce->refcount);
zend_hash_destroy(&ce->function_table);
zend_hash_destroy(&ce->default_properties);
break;
case ZEND_INTERNAL_CLASS:
free(ce->name);
free(ce->refcount);
zend_hash_destroy(&ce->function_table);
zend_hash_destroy(&ce->default_properties);
break;
}
return 1;
}
void zend_class_add_ref(zend_class_entry *ce)
{
(*ce->refcount)++;
}
@@ -212,7 +235,7 @@ zend_brk_cont_element *get_next_brk_cont_element(zend_op_array *op_array)
}
static void zend_update_extended_info(zend_op_array *op_array)
static void zend_update_extended_info(zend_op_array *op_array CLS_DC)
{
zend_op *opline = op_array->opcodes, *end=opline+op_array->last;
@@ -232,7 +255,7 @@ static void zend_update_extended_info(zend_op_array *op_array)
}
opline++;
}
opline = get_next_op(op_array);
opline = get_next_op(op_array CLS_CC);
opline->opcode = ZEND_EXT_STMT;
opline->op1.op_type = IS_UNUSED;
opline->op2.op_type = IS_UNUSED;
@@ -256,11 +279,11 @@ int pass_two(zend_op_array *op_array)
{
CLS_FETCH();
if (op_array->type != ZEND_USER_FUNCTION) {
if (op_array->type!=ZEND_USER_FUNCTION && op_array->type!=ZEND_EVAL_CODE) {
return 0;
}
if (CG(extended_info)) {
zend_update_extended_info(op_array);
zend_update_extended_info(op_array CLS_CC);
}
if (CG(handle_op_arrays)) {
zend_llist_apply_with_argument(&zend_extensions, (void (*)(void *, void *)) zend_extension_op_array_handler, op_array);
@@ -275,10 +298,10 @@ void pass_include_eval(zend_op_array *op_array)
while (opline<end) {
if (opline->op1.op_type==IS_CONST) {
opline->op1.u.constant.is_ref = 1;
opline->op1.u.constant.EA.is_ref = 1;
}
if (opline->op2.op_type==IS_CONST) {
opline->op2.u.constant.is_ref = 1;
opline->op2.u.constant.EA.is_ref = 1;
}
opline++;
}
@@ -293,17 +316,17 @@ int print_class(zend_class_entry *class_entry)
return 0;
}
ZEND_API void *get_unary_op(int opcode)
ZEND_API unary_op_type get_unary_op(int opcode)
{
switch(opcode) {
case ZEND_BW_NOT:
return (void *) bitwise_not_function;
return (unary_op_type) bitwise_not_function;
break;
case ZEND_BOOL_NOT:
return (void *) boolean_not_function;
return (unary_op_type) boolean_not_function;
break;
default:
return (void *) NULL;
return (unary_op_type) NULL;
break;
}
}
+90 -70
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
@@ -41,6 +45,9 @@ ZEND_API void convert_scalar_to_number(zval *op)
case IS_DOUBLE:
case IS_LONG:
break;
case IS_BOOL:
op->type = IS_LONG;
break;
#if WITH_BCMATH
case IS_BC:
op->type = IS_DOUBLE; /* may have lost significant digits */
@@ -72,6 +79,10 @@ ZEND_API void convert_scalar_to_number(zval *op)
break; \
} \
(op) = &(holder); \
} else if ((op)->type==IS_BOOL || (op)->type==IS_RESOURCE) { \
(holder) = *(op); \
(holder).type = IS_LONG; \
(op) = &(holder); \
}
@@ -88,9 +99,11 @@ ZEND_API void convert_scalar_to_number(zval *op)
(holder).value.lval = strtol((op)->value.str.val, NULL, 10); \
break; \
case IS_ARRAY: \
case IS_OBJECT: \
(holder).value.lval = (zend_hash_num_elements((op)->value.ht)?1:0); \
break; \
case IS_OBJECT: \
(holder).value.lval = (zend_hash_num_elements((op)->value.obj.properties)?1:0); \
break; \
default: \
zend_error(E_WARNING, "Cannot convert to ordinal value"); \
(holder).value.lval = 0; \
@@ -120,9 +133,11 @@ ZEND_API void convert_scalar_to_number(zval *op)
} \
break; \
case IS_ARRAY: \
case IS_OBJECT: \
(holder).value.lval = (zend_hash_num_elements((op)->value.ht)?1:0); \
break; \
case IS_OBJECT: \
(holder).value.lval = (zend_hash_num_elements((op)->value.obj.properties)?1:0); \
break; \
default: \
(holder).value.lval = 0; \
break; \
@@ -132,45 +147,6 @@ ZEND_API void convert_scalar_to_number(zval *op)
} \
static inline void zendi_convert_to_string(zval **op_ptr, zval *holder)
{
zval *op = *op_ptr;
ELS_FETCH();
if (op->type != IS_STRING) {
switch (op->type) {
case IS_BOOL:
holder->value.str.val = (op->value.lval?estrndup("1",1):estrndup("0",1));
holder->value.str.len = 1;
break;
case IS_RESOURCE:
case IS_LONG:
holder->value.str.val = (char *) emalloc(MAX_LENGTH_OF_LONG + 1);
holder->value.str.len = zend_sprintf(holder->value.str.val, "%ld", op->value.lval); /* SAFE */
break;
case IS_DOUBLE: {
holder->value.str.val = (char *) emalloc(MAX_LENGTH_OF_DOUBLE + EG(precision) + 1);
holder->value.str.len = zend_sprintf(holder->value.str.val, "%.*G", (int) EG(precision), op->value.dval); /* SAFE */
/* %G already handles removing trailing zeros from the fractional part, yay */
break;
}
case IS_ARRAY:
holder->value.str.val = estrndup("Array",sizeof("Array")-1);
holder->value.str.len = sizeof("Array")-1;
break;
case IS_OBJECT:
holder->value.str.val = estrndup("Object",sizeof("Object")-1);
holder->value.str.len = sizeof("Object")-1;
break;
default:
var_reset(holder);
break;
}
holder->type = IS_STRING;
*op_ptr = holder;
}
}
ZEND_API void convert_to_long(zval *op)
{
convert_to_long_base(op, 10);
@@ -243,12 +219,17 @@ ZEND_API void convert_to_double(zval *op)
STR_FREE(strval);
break;
case IS_ARRAY:
case IS_OBJECT:
tmp = (zend_hash_num_elements(op->value.ht)?1:0);
zval_dtor(op);
op->value.dval = tmp;
op->type = IS_DOUBLE;
break;
case IS_OBJECT:
tmp = (zend_hash_num_elements(op->value.obj.properties)?1:0);
zval_dtor(op);
op->value.dval = tmp;
op->type = IS_DOUBLE;
break;
default:
zend_error(E_WARNING, "Cannot convert to real value (type=%d)", op->type);
zval_dtor(op);
@@ -286,11 +267,15 @@ ZEND_API void convert_to_boolean(zval *op)
STR_FREE(strval);
break;
case IS_ARRAY:
case IS_OBJECT:
tmp = (zend_hash_num_elements(op->value.ht)?1:0);
zval_dtor(op);
op->value.lval = tmp;
break;
case IS_OBJECT:
tmp = (zend_hash_num_elements(op->value.obj.properties)?1:0);
zval_dtor(op);
op->value.lval = tmp;
break;
default:
zval_dtor(op);
op->value.lval = 0;
@@ -310,8 +295,13 @@ ZEND_API void convert_to_string(zval *op)
case IS_STRING:
break;
case IS_BOOL:
op->value.str.val = (op->value.lval?estrndup("1",1):estrndup("0",0));
op->value.str.len = 1;
if (op->value.lval) {
op->value.str.val = estrndup("1", 1);
op->value.str.len = 1;
} else {
op->value.str.val = empty_string;
op->value.str.len = 0;
}
break;
case IS_LONG:
lval = op->value.lval;
@@ -350,8 +340,7 @@ static void convert_scalar_to_array(zval *op, int type)
zval *entry = (zval *) emalloc(sizeof(zval));
*entry = *op;
entry->refcount = 1;
entry->is_ref = 0;
INIT_PZVAL(entry);
switch (type) {
case IS_ARRAY:
@@ -364,7 +353,7 @@ static void convert_scalar_to_array(zval *op, int type)
op->value.obj.properties = (HashTable *) emalloc(sizeof(HashTable));
zend_hash_init(op->value.obj.properties, 0, NULL, PVAL_PTR_DTOR, 0);
zend_hash_update(op->value.obj.properties, "scalar", sizeof("scalar"), (void *) &entry, sizeof(zval *), NULL);
op->value.obj.ce = &standard_class;
op->value.obj.ce = &zend_standard_class_def;
op->type = IS_OBJECT;
break;
}
@@ -395,7 +384,7 @@ ZEND_API void convert_to_object(zval *op)
case IS_ARRAY:
op->type = IS_OBJECT;
op->value.obj.properties = op->value.ht;
op->value.obj.ce = &standard_class;
op->value.obj.ce = &zend_standard_class_def;
return;
break;
case IS_OBJECT:
@@ -413,11 +402,11 @@ ZEND_API int add_function(zval *result, zval *op1, zval *op2)
zval op1_copy, op2_copy;
if (op1->type == IS_ARRAY && op2->type == IS_ARRAY) {
zval tmp;
zval *tmp;
zend_hash_merge(op1->value.ht,op2->value.ht,(void (*)(void *pData)) zval_copy_ctor, (void *) &tmp, sizeof(zval));
*result = *op1;
zval_dtor(op2);
zval_copy_ctor(result);
zend_hash_merge(result->value.ht, op2->value.ht, (void (*)(void *pData)) zval_add_ref, (void *) &tmp, sizeof(zval *), 0);
return SUCCESS;
}
zendi_convert_scalar_to_number(op1, op1_copy);
@@ -437,10 +426,10 @@ ZEND_API int add_function(zval *result, zval *op1, zval *op2)
}
if ((op1->type == IS_DOUBLE && op2->type == IS_LONG)
|| (op1->type == IS_LONG && op2->type == IS_DOUBLE)) {
result->type = IS_DOUBLE;
result->value.dval = (op1->type == IS_LONG ?
(((double) op1->value.lval) + op2->value.dval) :
(op1->value.dval + ((double) op2->value.lval)));
result->type = IS_DOUBLE;
return SUCCESS;
}
if (op1->type == IS_DOUBLE && op2->type == IS_DOUBLE) {
@@ -474,10 +463,10 @@ ZEND_API int sub_function(zval *result, zval *op1, zval *op2)
}
if ((op1->type == IS_DOUBLE && op2->type == IS_LONG)
|| (op1->type == IS_LONG && op2->type == IS_DOUBLE)) {
result->type = IS_DOUBLE;
result->value.dval = (op1->type == IS_LONG ?
(((double) op1->value.lval) - op2->value.dval) :
(op1->value.dval - ((double) op2->value.lval)));
result->type = IS_DOUBLE;
return SUCCESS;
}
if (op1->type == IS_DOUBLE && op2->type == IS_DOUBLE) {
@@ -511,10 +500,10 @@ ZEND_API int mul_function(zval *result, zval *op1, zval *op2)
}
if ((op1->type == IS_DOUBLE && op2->type == IS_LONG)
|| (op1->type == IS_LONG && op2->type == IS_DOUBLE)) {
result->type = IS_DOUBLE;
result->value.dval = (op1->type == IS_LONG ?
(((double) op1->value.lval) * op2->value.dval) :
(op1->value.dval * ((double) op2->value.lval)));
result->type = IS_DOUBLE;
return SUCCESS;
}
if (op1->type == IS_DOUBLE && op2->type == IS_DOUBLE) {
@@ -550,10 +539,10 @@ ZEND_API int div_function(zval *result, zval *op1, zval *op2)
}
if ((op1->type == IS_DOUBLE && op2->type == IS_LONG)
|| (op1->type == IS_LONG && op2->type == IS_DOUBLE)) {
result->type = IS_DOUBLE;
result->value.dval = (op1->type == IS_LONG ?
(((double) op1->value.lval) / op2->value.dval) :
(op1->value.dval / ((double) op2->value.lval)));
result->type = IS_DOUBLE;
return SUCCESS;
}
if (op1->type == IS_DOUBLE && op2->type == IS_DOUBLE) {
@@ -834,11 +823,18 @@ ZEND_API int add_string_to_string(zval *result, zval *op1, zval *op2)
ZEND_API int concat_function(zval *result, zval *op1, zval *op2)
{
zval op1_copy, op2_copy;
zval *orig_op1=op1, *orig_op2=op2;
zendi_convert_to_string(&op1, &op1_copy);
zendi_convert_to_string(&op2, &op2_copy);
int use_copy1, use_copy2;
zend_make_printable_zval(op1, &op1_copy, &use_copy1);
zend_make_printable_zval(op2, &op2_copy, &use_copy2);
if (use_copy1) {
op1 = &op1_copy;
}
if (use_copy2) {
op2 = &op2_copy;
}
if (result==op1) { /* special case, perform operations on result */
uint res_len = op1->value.str.len + op2->value.str.len;
@@ -859,10 +855,10 @@ ZEND_API int concat_function(zval *result, zval *op1, zval *op2)
result->value.str.val[result->value.str.len] = 0;
result->type = IS_STRING;
}
if (orig_op1 != op1) {
if (use_copy1) {
zval_dtor(op1);
}
if (orig_op2 != op2) {
if (use_copy2) {
zval_dtor(op2);
}
return SUCCESS;
@@ -879,10 +875,10 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2)
}
if (op1->type == IS_BOOL || op2->type == IS_BOOL) {
convert_to_boolean(op1);
convert_to_boolean(op2);
zendi_convert_to_boolean(op1, op1_copy);
zendi_convert_to_boolean(op2, op2_copy);
result->type = IS_LONG;
result->value.lval = (op1->value.lval!=op2->value.lval);
result->value.lval = op1->value.lval - op2->value.lval;
return SUCCESS;
}
zendi_convert_scalar_to_number(op1, op1_copy);
@@ -895,8 +891,8 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2)
}
if ((op1->type == IS_DOUBLE || op1->type == IS_LONG)
&& (op2->type == IS_DOUBLE || op2->type == IS_LONG)) {
result->type = IS_DOUBLE;
result->value.dval = (op1->type == IS_LONG ? (double) op1->value.lval : op1->value.dval) - (op2->type == IS_LONG ? (double) op2->value.lval : op2->value.dval);
result->type = IS_DOUBLE;
return SUCCESS;
}
if ((op1->type==IS_ARRAY || op1->type==IS_OBJECT)
@@ -1155,6 +1151,30 @@ ZEND_API int zend_binary_strcmp(zval *s1, zval *s2)
}
ZEND_API int zend_binary_strcasecmp(zval *s1, zval *s2)
{
const unsigned char *p1 = (const unsigned char *)s1->value.str.val;
const unsigned char *p2 = (const unsigned char *)s2->value.str.val;
unsigned char c1 = 0, c2 = 0;
int len1, len2;
len1 = s1->value.str.len;
len2 = s2->value.str.len;
if (len1 != len2 || !len1) {
return len1 - len2;
}
while (len1--) {
c1 = tolower(*p1++);
c2 = tolower(*p2++);
if (c1 != c2) {
break;
}
}
return c1 - c2;
}
ZEND_API void zendi_smart_strcmp(zval *result, zval *s1, zval *s2)
{
int ret1,ret2;
+11 -4
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _OPERATORS_H
#define _OPERATORS_H
@@ -45,6 +49,7 @@ ZEND_API int is_smaller_or_equal_function(zval *result, zval *op1, zval *op2);
ZEND_API int increment_function(zval *op1);
ZEND_API int decrement_function(zval *op2);
BEGIN_EXTERN_C()
ZEND_API void convert_scalar_to_number(zval *op);
ZEND_API void convert_to_string(zval *op);
ZEND_API void convert_to_long(zval *op);
@@ -55,12 +60,14 @@ ZEND_API void convert_to_object(zval *op);
ZEND_API int add_char_to_string(zval *result, zval *op1, zval *op2);
ZEND_API int add_string_to_string(zval *result, zval *op1, zval *op2);
ZEND_API void convert_to_double(zval *op);
END_EXTERN_C()
ZEND_API int zval_is_true(zval *op);
ZEND_API int compare_function(zval *result, zval *op1, zval *op2);
ZEND_API void zend_str_tolower(char *str, unsigned int length);
ZEND_API int zend_binary_strcmp(zval *s1, zval *s2);
ZEND_API int zend_binary_strcasecmp(zval *s1, zval *s2);
ZEND_API void zendi_smart_strcmp(zval *result, zval *s1, zval *s2);
#endif
+11 -4
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include "zend.h"
#include "zend_ptr_stack.h"
@@ -68,4 +72,7 @@ ZEND_API void zend_ptr_stack_clean(zend_ptr_stack *stack, void (*func)(void *))
{
zend_ptr_stack_apply(stack, func);
stack->top = 0;
stack->top_element = stack->elements;
}
+8 -5
View File
@@ -4,10 +4,13 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
@@ -18,7 +21,7 @@
#ifndef _ZEND_PTR_STACK_H
#define _ZEND_PTR_STACK_H
typedef struct {
typedef struct _zend_ptr_stack {
short top, max;
void **elements;
void **top_element;
+10 -4
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include <stdio.h>
#include "zend.h"
@@ -22,6 +26,7 @@
#include <stdarg.h>
#endif
#if BROKEN_SPRINTF
int zend_sprintf(char *buffer, const char *format, ...)
{
va_list args;
@@ -32,3 +37,4 @@ int zend_sprintf(char *buffer, const char *format, ...)
return strlen(buffer);
}
#endif
+8 -4
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include "zend.h"
#include "zend_stack.h"
+9 -5
View File
@@ -4,20 +4,24 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _ZEND_STACK_H
#define _ZEND_STACK_H
typedef struct {
typedef struct _zend_stack {
int top, max;
void **elements;
} zend_stack;
+17 -23
View File
@@ -4,16 +4,20 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include <stdio.h>
#include "zend.h"
#include "zend_API.h"
@@ -47,10 +51,10 @@ ZEND_API inline void var_uninit(zval *var)
}
ZEND_API void zval_dtor(zval *zvalue)
ZEND_API int zval_dtor(zval *zvalue)
{
if (zvalue->type==IS_LONG) {
return;
return 1;
}
switch(zvalue->type) {
case IS_STRING:
@@ -61,25 +65,14 @@ ZEND_API void zval_dtor(zval *zvalue)
ELS_FETCH();
if (zvalue->value.ht && (zvalue->value.ht != &EG(symbol_table))) {
if (EG(AiCount)==0) {
zend_hash_destroy(zvalue->value.ht);
efree(zvalue->value.ht);
} else {
zend_ptr_stack_push(&EG(garbage), zvalue->value.ht);
}
zend_hash_destroy(zvalue->value.ht);
efree(zvalue->value.ht);
}
}
break;
case IS_OBJECT: {
ELS_FETCH();
if (EG(AiCount)==0) {
zend_hash_destroy(zvalue->value.obj.properties);
efree(zvalue->value.obj.properties);
} else {
zend_ptr_stack_push(&EG(garbage), zvalue->value.obj.properties);
}
}
case IS_OBJECT:
zend_hash_destroy(zvalue->value.obj.properties);
efree(zvalue->value.obj.properties);
break;
case IS_RESOURCE:
/* destroy resource */
@@ -89,9 +82,10 @@ ZEND_API void zval_dtor(zval *zvalue)
case IS_DOUBLE:
case IS_BOOL:
default:
return;
return 1;
break;
}
return 1;
}
+15 -8
View File
@@ -4,29 +4,36 @@
+----------------------------------------------------------------------+
| Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+----------------------------------------------------------------------+
| This source file is subject to the Zend license, that is bundled |
| with this package in the file LICENSE. If you did not receive a |
| copy of the Zend license, please mail us at zend@zend.com so we can |
| send you a copy immediately. |
| This source file is subject to version 0.91 of the Zend license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.zend.com/license/0_91.txt. |
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@zend.com so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andi Gutmans <andi@zend.com> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#ifndef _VARIABLES_H
#define _VARIABLES_H
ZEND_API int zend_print_variable(zval *var);
BEGIN_EXTERN_C()
ZEND_API int zval_copy_ctor(zval *zvalue);
ZEND_API void zval_dtor(zval *zvalue);
ZEND_API void zval_ptr_dtor(zval **zval_ptr);
ZEND_API int zval_dtor(zval *zvalue);
END_EXTERN_C()
ZEND_API int zval_ptr_dtor(zval **zval_ptr);
void zval_add_ref(zval **p);
#define PVAL_DESTRUCTOR (void (*)(void *)) zval_dtor
#define PVAL_PTR_DTOR (void (*)(void *)) zval_ptr_dtor
#define PVAL_DESTRUCTOR (int (*)(void *)) zval_dtor
#define PVAL_PTR_DTOR (int (*)(void *)) zval_ptr_dtor
#define PVAL_COPY_CTOR (void (*)(void *)) zval_copy_ctor
ZEND_API void var_reset(zval *var);
-261
View File
@@ -1,261 +0,0 @@
/* 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
+118
View File
@@ -0,0 +1,118 @@
/* This is the default configuration file to read -*- C -*- */
/* these are defined by automake */
#undef PACKAGE
#undef VERSION
#undef HAVE_STRUCT_FLOCK
#undef HAVE_TM_GMTOFF
#define CONFIGURATION_FILE_PATH "php3.ini"
#define USE_CONFIG_FILE 1
#undef HAVE_DMALLOC
/* 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
/* 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 */
#undef HAVE_DIRENT_H
/* Define if you have the resolv library (-lresolv). */
#undef HAVE_LIBRESOLV
/* Define if you have the pam library (-lpam). */
#define HAVE_LIBPAM 0
/* Define if you have the bind library (-lbind). */
#define HAVE_LIBBIND 0
/* Define if you have Netscape LDAP instead of umich ldap or openldap*/
#define HAVE_NSLDAP 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 both of these if you want the bundled REGEX library */
#define REGEX 0
#define HSREGEX 0
/* Define if you have and want to use libnsl */
#undef HAVE_LIBNSL
/* Define if you have and want to use libsocket */
#undef HAVE_LIBSOCKET
/* 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 DEBUG /* should be set to ZEND_DEBUG */
#define DEBUG 0
#endif
/* Define if you want to enable PHP RPC (experimental) */
#define PHP_RPC 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 include() and other functions to be able to open
* http and ftp URLs as files.
*/
#define PHP3_URL_FOPEN 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 to compile PHP/Zend thread safe */
#undef ZTS
+154
View File
@@ -0,0 +1,154 @@
dnl $Id$
dnl
dnl This file contains local autoconf functions.
dnl
dnl AC_PHP_ONCE(namespace, variable, code)
dnl
dnl execute code, if variable is not set in namespace
dnl
AC_DEFUN(AC_PHP_ONCE,[
unique=`echo $ac_n "$2$ac_c" | tr -c -d a-zA-Z0-9`
cmd="echo $ac_n \"\$$1$unique$ac_c\""
if test -n "$unique" && test "`eval $cmd`" = "" ; then
eval "$1$unique=set"
$3
fi
])
dnl
dnl AC_EXPAND_PATH(path, variable)
dnl
dnl expands path to an absolute path and assigns it to variable
dnl
AC_DEFUN(AC_EXPAND_PATH,[
if test -z "$1" || echo "$1" | grep '^/' >/dev/null ; then
$2="$1"
else
$2="`pwd`/$1"
fi
])
dnl
dnl AC_ADD_LIBPATH(path)
dnl
dnl add a library to linkpath/runpath
dnl
AC_DEFUN(AC_ADD_LIBPATH,[
AC_EXPAND_PATH($1, ai_p)
AC_PHP_ONCE(LIBPATH, $ai_p, [
EXTRA_LIBS="$EXTRA_LIBS -L$ai_p"
if test -n "$rpath_raw" ; then
RPATHS="$RPATHS ${raw_runpath_switch}$ai_p"
elif test -n "$APXS" ; then
RPATHS="$RPATHS ${apxs_runpath_switch}$ai_p'"
else
RPATHS="$RPATHS ${ld_runpath_switch}$ai_p"
fi
])
])
dnl
dnl AC_ADD_INCLUDE(path)
dnl
dnl add a include path
dnl
AC_DEFUN(AC_ADD_INCLUDE,[
AC_EXPAND_PATH($1, ai_p)
AC_PHP_ONCE(INCLUDEPATH, $ai_p, [
INCLUDES="$INCLUDES -I$ai_p"
])
])
dnl
dnl AC_ADD_LIBRARY(library)
dnl
dnl add a library to the link line
dnl
AC_DEFUN(AC_ADD_LIBRARY,[
AC_PHP_ONCE(LIBRARY, $1, [
EXTRA_LIBS="$EXTRA_LIBS -l$1"
])
])
dnl
dnl AC_ADD_LIBRARY_WITH_PATH(library, path)
dnl
dnl add a library to the link line and path to linkpath/runpath
dnl
AC_DEFUN(AC_ADD_LIBRARY_WITH_PATH,[
AC_ADD_LIBPATH($2)
AC_ADD_LIBRARY($1)
])
dnl
dnl Check for cc option
dnl
AC_DEFUN(AC_CHECK_CC_OPTION,[
echo "main(){return 0;}" > conftest.$ac_ext
opt="$1"
var=`echo $ac_n "$opt$ac_c"|tr -c a-zA-Z0-9 _`
AC_MSG_CHECKING([if compiler supports -$1 really])
ac_php_compile="${CC-cc} -$opt -c $CFLAGS $CPPFLAGS conftest.$ac_ext 2>&1"
if eval $ac_php_compile | egrep "$opt" > /dev/null 2>&1 ; then
eval php_cc_$var=no
AC_MSG_RESULT(no)
else
eval php_cc_$var=yes
AC_MSG_RESULT(yes)
fi
])
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)
])
])
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 Stuff to do when setting up a new extension.
dnl XXX have to change the hardcoding of ".a" when we want to be able
dnl to make dynamic libraries as well.
dnl
AC_DEFUN(PHP_EXTENSION,[
EXT_SUBDIRS="$EXT_SUBDIRS $1"
_extlib="libphpext_$1.a"
EXT_LIBS="$EXT_LIBS $1/$_extlib"
EXTINFO_DEPS="$EXTINFO_DEPS ../ext/$1/extinfo.c.stub"
dnl EXT_INCLUDE_CODE="\#include \"ext/$1/php3_$1.h\"\\n$EXT_INCLUDE_CODE"
dnl EXT_MODULE_PTRS="phpext_$1_ptr, $EXT_MODULE_PTRS"
dnl "
])
AC_SUBST(EXT_SUBDIRS)
AC_SUBST(EXT_LIBS)
AC_SUBST(EXTINFO_DEPS)
dnl AC_SUBST(EXT_INCLUDE_CODE)
dnl AC_SUBST(EXT_MODULES_PTRS)
Vendored
-417
View File
@@ -1,417 +0,0 @@
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)])
+12 -12
View File
@@ -1,38 +1,38 @@
##
## Apache 1.3 Makefile template for PHP3 Module
## [src/modules/php3/Makefile.tmpl]
## [src/modules/php4/Makefile.tmpl]
##
# the parametrized target
LIB=libphp3.$(LIBEXT)
LIB=libphp4.$(LIBEXT)
# objects for building the static library
OBJS=mod_php3.o
OBJS_LIB=libmodphp3.a
OBJS=mod_php4.o
OBJS_LIB=libmodphp4.a
# objects for building the shared object library
SHLIB_OBJS=mod_php3.so-o
SHLIB_OBJS_LIB=libmodphp3-so.a
SHLIB_OBJS=mod_php4.so-o
SHLIB_OBJS_LIB=libmodphp4-so.a
# the general targets
all: lib
lib: $(LIB)
# build the static library by merging the object files
libphp3.a: $(OBJS) $(OBJS_LIB)
libphp4.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)
libphp4.: $(OBJS) $(OBJS_LIB)
cp $(OBJS_LIB) $@
ar r $@ $(OBJS)
$(RANLIB) $@
cp libphp3. libphp3.a
cp libphp4. libphp4.a
# build the shared object library by linking the object files
libphp3.so: $(SHLIB_OBJS) $(SHLIB_OBJS_LIB)
libphp4.so: $(SHLIB_OBJS) $(SHLIB_OBJS_LIB)
rm -f $@
$(LD_SHLIB) $(LDFLAGS_SHLIB) -o $@ $(SHLIB_OBJS) $(SHLIB_OBJS_LIB) $(LIBS)
@@ -69,9 +69,9 @@ depend:
$(OBJS): Makefile
# DO NOT REMOVE
mod_php3.o: mod_php3.c $(INCDIR)/httpd.h $(INCDIR)/conf.h \
mod_php4.o: mod_php4.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
$(INCDIR)/http_log.h $(INCDIR)/util_script.h mod_php4.h
+276
View File
@@ -0,0 +1,276 @@
Following is a merge of two letters I sent to php4beta@lists.php.net,
describing the changes in API between PHP 3.0 and PHP 4.0 (Zend).
This file is by no means thorough documentation of the PHP API,
and is intended for developers who are familiar with the PHP 3.0 API,
and want to port their code to PHP 4.0, or take advantage of its new
features. For highlights about the PHP 3.0 API, consult apidoc.txt.
Zeev
--------------------------------------------------------------------------
I'm going to try to list the important changes in API and programming
techniques that are involved in developing modules for PHP4/Zend, as
opposed to PHP3. Listing the whole PHP4 API is way beyond my scope here,
it's mostly a 'diff' from the apidoc.txt, which you're all pretty familiar
with.
An important note that I neglected to mention yesterday - the php4 tree is
based on the php 3.0.5 tree, plus all 3.0.6 patches hand-patched into it.
Notably, it does NOT include any 3.0.7 patches. All of those have to be
reapplied, with extreme care - modules should be safe to patch (mostly),
but anything that touches the core or main.c will almost definitely require
changes in order to work properly.
[1] Symbol Tables
One of the major changes in Zend involves changing the way symbols tables
work. Zend enforces reference counting on all values and resources. This
required changes in the semantics of the hash tables that implement symbol
tables. Instead of storing pval in the hashes, we now store pval *. All
of the API functions in Zend were changed in a way that this change is
completely transparent. However, if you've used 'low level' hash functions
to access or update elements in symbol tables, your code will require
changes. Following are two simple examples, one demonstrates the
difference between PHP3 and Zend when reading a symbol's value, and the
other demonstrates the difference when writing a value.
php3_read()
{
pval *foo;
_php3_hash_find(ht, "foo", sizeof("foo"), &foo);
/* foo->type is the type and foo->value is the value */
}
php4_read()
{
pval **foo;
_php3_hash_find(ht, "foo", sizeof("foo"), &foo);
/* (*foo)->type is the type and (*foo)->value is the value */
}
---
php3_write()
{
pval newval;
newval.type = ...;
newval.value = ...;
_php3_hash_update(ht, "bar", sizeof("bar"), &newval, sizeof(pval), NULL);
}
php4_write()
{
pval *newval = (pval *) emalloc(sizeof(pval));
newval->refcount=1;
newval->is_ref=0;
newval->type = ...;
newval->value = ...;
_php3_hash_update(ht, "bar", sizeof("bar"), &newval, sizeof(pval *), NULL);
}
[2] Resources
One of the 'cute' things about the reference counting support is that it
completely eliminates the problem of resource leaking. A simple loop that
included '$result = mysql_query(...)' in PHP leaked unless the user
remembered to run mysql_free($result) at the end of the loop body, and
nobody really did. In order to take advantage of the automatic resource
deallocation upon destruction, there's virtually one small change you need
to conduct. Change the result type of a resource that you want to destroy
itself as soon as its no longer referenced (just about any resource I can
think of) as IS_RESOURCE, instead of as IS_LONG. The rest is magic.
A special treatment is required for SQL modules that follow MySQL's
approach for having the link handle as an optional argument. Modules that
follow the MySQL module model, store the last opened link in a global
variable, that they use in case the user neglects to explicitly specify a
link handle. Due to the way referenec counting works, this global
reference is just like any other reference, and must increase that SQL link
resource's reference count (otherwise, it will be closed prematurely).
Simply, when you set the default link to a certain link, increase that
link's reference count by calling zend_list_addref().
As always, the MySQL module is the one used to demonstrate 'new
technology'. You can look around it and look for IS_RESOURCE, as well as
zend_list_addref(), to see a clear example of how the new API should be used.
[3] Thread safety issues
I'm not going to say that Zend was designed with thread safety in mind, but
from some point, we've decided upon several guidelines that would make the
move to thread safety much, much easier. Generally, we've followed the PHP
3.1 approach of moving global variables to a structure, and encapsulating
all global variable references within macros. There are three main
differences:
1. We grouped related globals in a single structure, instead of grouping
all globals in one structure.
2. We've used much, much shorter macro names to increase the readability
of the source code.
3. Regardless of whether we're compiling in thread safe mode or not, all
global variables are *always* stored in a structure. For example, you
would never have a global variable 'foo', instead, it'll be a property of a
global structure, for example, compiler_globals.foo. That makes
development much, much easier, since your code will simply not compile
unless you remember to put the necessary macro around foo.
To write code that'll be thread safe in the future (when we release our
thread safe memory manager and work on integrating it), you can take a look
at zend_globals.h. Essentially, two sets of macros are defined, one for
thread safe mode, and one for thread unsafe mode. All global references
are encapsulated within ???G(varname), where ??? is the appropriate prefix
for your structure (for example, so far we have CG(), EG() and AG(), which
stand for the compiler, executor and memory allocator, respectively).
When compiling with thread safety enabled, each function that makes use of
a ???G() macro, must obtain the pointer to its copy of the structure. It
can do so in one of two forms:
1. It can receive it as an argument.
2. It can fetch it.
Obviously, the first method is preferable since it's much quicker.
However, it's not always possible to send the structure all the way to a
particular function, or it may simply bloat the code too much in some
cases. Functions that receive the globals as an argument, should look like
this:
rettype functioname(???LS_D) <-- a function with no arguments
rettype functioname(type arg1, ..., type argn ???LS_DC) <-- a funciton with
arguments
Calls to such functions should look like this:
functionname(???LS_C) <-- a function with no arguments
functionname(arg1, ..., argn ???LS_CC) <-- a function with arguments
LS stands for 'Local Storage', _C stands for Call and _CC stands for Call
Comma, _D stands for Declaration and _DC stands for Declaration Comma.
Note that there's NO comma between the last argument and ???LS_DC or ???LS_CC.
In general, every module that makes use of globals should use this approach
if it plans to be thread safe.
[4] Generalized INI support
The code comes to solve several issues:
a. The ugly long block of code in main.c that reads values from the
cfg_hash into php3_ini.
b. Get rid of php3_ini. The performance penalty of copying it around all
the time in the Apache module probably wasn't too high, but
psychologically, it annoyed me :)
c. Get rid of the ugly code in mod_php4.c, that also reads values from
Apache directives and puts them into the php3_ini structure.
d. Generalize all the code so that you only have to add an entry in one
single place and get it automatically supported in php3.ini, Apache, Win32
registry, runtime function ini_get() and ini_alter() and any future method
we might have.
e. Allow users to easily override *ANY* php3.ini value, except for ones
they're not supposed to, of course.
I'm happy to say that I think I pretty much reached all goals. php_ini.c
implements a mechanism that lets you add your INI entry in a single place,
with a default value in case there's no php3.ini value. What you get by
using this mechanism:
1. Automatic initialization from php3.ini if available, or from the
default value if not.
2. Automatic support in ini_alter(). That means a user can change the
value for this INI entry at runtime, without you having to add in a single
line of code, and definitely no additional function (for example, in PHP3,
we had to add in special dedicated functions, like
set_magic_quotes_runtime() or the likes - no need for that anymore).
3. Automatic support in Apache .conf files.
4. No need for a global php3_ini-like variable that'll store all that
info. You can directly access each INI entry by name, in runtime. 'Sure,
that's not revolutionary, it's just slow' is probably what some of you
think - which is true, but, you can also register a callback function that
is called each time your INI entry is changed, if you wish to store it in a
cached location for intensive use.
5. Ability to access the current active value for a given INI entry, and
the 'master' value.
Of course, (2) and (3) are only applicable in some cases. Some entries
shouldn't be overriden by users in runtime or through Apache .conf files -
you can, of course, mark them as such.
So, enough hype, how does it work.
Essentially:
static PHP_INI_MH(OnChangeBar); /* declare a message handler for a change
in "bar" */
PHP_INI_BEGIN()
PHP_INI_ENTRY("foo", "1", PHP_INI_ALL, NULL, NULL)
PHP_INI_ENTRY("bar", "bah", PHP_INI_SYSTEM, OnChangeBar, NULL)
PHP_INI_END()
static PHP_INI_MH(OnChangeBar)
{
a_global_var_for_bar = new_value;
return SUCCESS;
}
int whatever_minit(INIT_FUNC_ARGS)
{
...
REGISTER_INI_ENTRIES();
...
}
int whatever_mshutdown(SHUTDOWN_FUNC_ARGS)
{
...
UNREGISTER_INI_ENTRIES();
...
}
and that's it. Here's what it does. As you can probably guess, this code
registers two INI entries - "foo" and "bar". They're given defaults "1"
and "bah" respectively - note that all defaults are always given as
strings. That doesn't reduce your ability to use integer values, simply
specify them as strings. "foo" is marked so that it can be changed by
anyone at any time (PHP_INI_ALL), whereas "foo" is marked so it can be
changed only at startup in the php3.ini only, presumably, by the system
administrator (PHP_INI_SYSTEM).
When "foo" changes, no function is called. Access to it is done using the
macros INI_INT("foo"), INI_FLT("foo") or INI_STR("foo"), which return a
long, double or char * respectively (strings that are returned aren't
duplicated - if they're manipulated, you must duplicate them first). You
can also access the original value (the 'master' value, in case one of them
was overriden by a user) using another pair of macros:
INI_ORIG_INT("foo"), INI_ORIG_FLT("foo") and INI_ORIG_STR("foo").
When "bar" changes, a special message handler is called, OnBarChange().
Always declare those message handlers using PHP_INI_MH(), as they might
change in the future. Message handlers are called as soon as an ini entry
initializes or changes, and allow you to cache a certain INI value in a
quick C structure. In this example, whenever "bar" changes, the new value
is stored in a_global_var_for_bar, which is a global char * pointer,
quickly accessible from other functions. Things get a bit more complicated
when you want to implement a thread-safe module, but it's doable as well.
Message handlers may return SUCCESS to acknowledge the new value, or
FAILURE to reject it. That enables you to reject invalid values for some
INI entries if you want. Finally, you can have a pointer passed to your
message handler - that's the fifth argument to PHP_INI_ENTRY(). It is
passed as mh_arg to the message handler.
Remember that for certain values, there's really no reason to mess with a
callback function. A perfect example for this are the syntax highlight
colors, which no longer have a dedicated global C slot that stores them,
but instead, are fetched from the php_ini hash on demand.
"As always", for a perfect working example of this mechanism, consult
functions/mysql.c. This module uses the new INI entry mechanism, and was
also converted to be thread safe in general, and in its php_ini support in
particular. Converting your modules to look like this for thread safety
isn't a bad idea (not necessarily now, but in the long run).
+3 -3
View File
@@ -19,7 +19,7 @@ Table of Contents
All functions look like this:
void php3_foo(INTERNAL_FUNCTION_PARAMETERS) {
PHP_FUNCTION(foo) {
}
@@ -471,13 +471,13 @@ 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.
1. Add directive to php3_ini_structure struct in mod_php4.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
structure in mod_php4.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.
-705
View File
@@ -1,705 +0,0 @@
/* -*-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;
}
+59 -52
View File
@@ -27,59 +27,66 @@
+----------------------------------------------------------------------+
*/
#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_ADA_INCLUDE ""
#define PHP_ADA_LFLAGS ""
#define PHP_ADA_LIBS ""
#define PHP_APACHE_INCLUDE ""
#define PHP_APACHE_TARGET ""
#define PHP_FHTTPD_INCLUDE ""
#define PHP_FHTTPD_LIB ""
#define PHP_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_DBASE_LIB ""
#define PHP_DEBUG "@DEBUG_CFLAGS@"
#define PHP_GDBM_INCLUDE ""
#define PHP_HSREGEX ""
#define PHP_IBASE_INCLUDE ""
#define PHP_IBASE_LFLAGS ""
#define PHP_IBASE_LIBS ""
#define PHP_IFX_INCLUDE ""
#define PHP_IFX_LFLAGS ""
#define PHP_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_IODBC_INCLUDE ""
#define PHP_IODBC_LFLAGS ""
#define PHP_IODBC_LIBS ""
#define PHP_MSQL_INCLUDE ""
#define PHP_MSQL_LFLAGS ""
#define PHP_MSQL_LIBS ""
#define PHP_MYSQL_INCLUDE ""
#define PHP_MYSQL_LFLAGS ""
#define PHP_MYSQL_LIBS ""
#define PHP_ORACLE_HOME ""
#define PHP_ORACLE_INCLUDE ""
#define PHP_ORACLE_LFLAGS ""
#define PHP_ORACLE_LIBS ""
#define PHP_ORACLE_SHLIBS ""
#define PHP_ORACLE_STLIBS ""
#define PHP_ORACLE_VERSION ""
#define PHP_PGSQL_INCLUDE ""
#define PHP_PGSQL_LFLAGS ""
#define PHP_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@"
#define PHP_REGEX_LIB ""
#define PHP_SOLID_INCLUDE ""
#define PHP_SOLID_LIBS ""
#define PHP_EMPRESS_INCLUDE ""
#define PHP_EMPRESS_LIBS ""
#define PHP_SYBASE_INCLUDE ""
#define PHP_SYBASE_LFLAGS ""
#define PHP_SYBASE_LIBS ""
#define PHP_DBM_TYPE ""
#define PHP_DBM_LIB ""
#define PHP_LDAP_LFLAGS ""
#define PHP_LDAP_INCLUDE ""
#define PHP_LDAP_LIBS ""
#define PHP_VELOCIS_INCLUDE ""
#define PHP_VELOCIS_LIBS ""
#define ODBC_TYPE ""
#define ODBC_INCDIR ""
#define ODBC_INCLUDE ""
#define ODBC_LIBDIR ""
#define ODBC_LFLAGS ""
#define ODBC_LIBS ""
Executable
+35
View File
@@ -0,0 +1,35 @@
#!/bin/sh
if test "$1" = "--copy"; then
automake_flags=--copy
fi
test -d libzend || ln -s ../libzend .
test -d TSRM || ln -s ../TSRM .
./scripts/preconfig
mv aclocal.m4 aclocal.m4.old 2>/dev/null
aclocal
if cmp aclocal.m4.old aclocal.m4 > /dev/null 2>&1; then
echo keeping aclocal.m4
mv aclocal.m4.old aclocal.m4
else
echo created or modified aclocal.m4
fi
autoheader
automake --add-missing --include-deps $automake_flags
mv configure configure.old 2>/dev/null
autoconf
if cmp configure.old configure > /dev/null 2>&1; then
echo keeping configure
mv configure.old configure
else
echo created or modified configure
fi
(cd libzend; ./buildconf libzend/)
(cd TSRM; ./buildconf TSRM/)
+479
View File
@@ -0,0 +1,479 @@
/*
+----------------------------------------------------------------------+
| PHP version 4.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997, 1998, 1999 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.0 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_0.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
| Stig Bakken <ssb@fast.no> |
| Zeev Suraski <zeev@zend.com> |
+----------------------------------------------------------------------+
*/
#include "php.h"
#include "php_globals.h"
#include "SAPI.h"
#if CGI_BINARY
#include <stdio.h>
#include "php.h"
#ifdef MSVC5
#include "win32/time.h"
#include "win32/signal.h"
#include <process.h>
#else
#include "build-defs.h"
#endif
#if HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#if HAVE_SIGNAL_H
#include <signal.h>
#endif
#if HAVE_SETLOCALE
#include <locale.h>
#endif
#include "zend.h"
#include "php_ini.h"
#include "php_globals.h"
#include "main.h"
#include "fopen-wrappers.h"
#include "ext/standard/php3_standard.h"
#include "snprintf.h"
#if WIN32|WINNT
#include <io.h>
#include <fcntl.h>
#include "win32/syslog.h"
#include "win32/php_registry.h"
#else
#include <syslog.h>
#endif
#include "zend_compile.h"
#include "zend_execute.h"
#include "zend_highlight.h"
#include "zend_indent.h"
#if USE_SAPI
#include "serverapi/sapi.h"
void *gLock;
#ifndef THREAD_SAFE
struct sapi_request_info *sapi_rqst;
#endif
#endif
#if MSVC5 || !defined(HAVE_GETOPT)
#include "php_getopt.h"
#endif
PHPAPI extern char *php3_ini_path;
#define PHP_MODE_STANDARD 1
#define PHP_MODE_HIGHLIGHT 2
#define PHP_MODE_INDENT 3
PHPAPI extern char *optarg;
PHPAPI extern int optind;
static int zend_cgibin_ub_write(const char *str, uint str_length)
{
return fwrite(str, 1, str_length, stdout);
}
static void sapi_cgi_send_header(sapi_header_struct *sapi_header, void *server_context)
{
if (sapi_header) {
PHPWRITE_H(sapi_header->header, sapi_header->header_len);
}
PHPWRITE_H("\r\n", 2);
}
static int sapi_cgi_read_post(char *buffer, uint count_bytes SLS_DC)
{
uint read_bytes=0, tmp_read_bytes;
count_bytes = MIN(count_bytes, SG(request_info).content_length-SG(read_post_bytes));
while (read_bytes < count_bytes) {
tmp_read_bytes = read(0, buffer+read_bytes, count_bytes-read_bytes);
if (tmp_read_bytes<=0) {
break;
}
read_bytes += tmp_read_bytes;
}
return read_bytes;
}
static char *sapi_cgi_read_cookies(SLS_D)
{
return getenv("HTTP_COOKIE");
}
static sapi_module_struct sapi_module = {
"PHP Language", /* name */
php_module_startup, /* startup */
php_module_shutdown_wrapper, /* shutdown */
zend_cgibin_ub_write, /* unbuffered write */
php3_error, /* error handler */
NULL, /* header handler */
NULL, /* send headers handler */
sapi_cgi_send_header, /* send header handler */
sapi_cgi_read_post, /* read POST data */
sapi_cgi_read_cookies /* read Cookies */
};
static void php_cgi_usage(char *argv0)
{
char *prog;
prog = strrchr(argv0, '/');
if (prog) {
prog++;
} else {
prog = "php";
}
php3_printf("Usage: %s [-q] [-h]"
" [-s]"
" [-v] [-i] [-f <file>] | "
"{<file> [args...]}\n"
" -q Quiet-mode. Suppress HTTP Header output.\n"
" -s Display colour syntax highlighted source.\n"
" -f<file> Parse <file>. Implies `-q'\n"
" -v Version number\n"
" -c<path> Look for php.ini file in this directory\n"
#if SUPPORT_INTERACTIVE
" -a Run interactively\n"
#endif
" -e Generate extended information for debugger/profiler\n"
" -i PHP information\n"
" -h This help\n", prog);
}
static void init_request_info(SLS_D)
{
char *content_length = getenv("CONTENT_LENGTH");
SG(request_info).request_method = getenv("REQUEST_METHOD");
SG(request_info).query_string = getenv("QUERY_STRING");
SG(request_info).request_uri = getenv("PATH_INFO");
SG(request_info).path_translated = NULL; /* we have to update it later, when we have that information */
SG(request_info).content_type = getenv("CONTENT_TYPE");
SG(request_info).content_length = (content_length?atoi(content_length):0);
/* CGI does not support HTTP authentication */
SG(request_info).auth_user = NULL;
SG(request_info).auth_password = NULL;
}
int main(int argc, char *argv[])
{
int cgi = 0, c, i, len;
zend_file_handle file_handle;
char *s;
/* temporary locals */
int cgi_started=0;
int behavior=PHP_MODE_STANDARD;
int no_headers=0;
#if SUPPORT_INTERACTIVE
int interactive=0;
#endif
/* end of temporary locals */
#ifdef ZTS
zend_compiler_globals *compiler_globals;
zend_executor_globals *executor_globals;
php_core_globals *core_globals;
sapi_globals_struct *sapi_globals;
#endif
#ifndef ZTS
if (setjmp(EG(bailout))!=0) {
return -1;
}
#endif
#ifdef ZTS
tsrm_startup(1,1,0);
#endif
sapi_startup(&sapi_module);
#if WIN32|WINNT
_fmode = _O_BINARY; /*sets default for file streams to binary */
setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */
setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */
setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */
#endif
/* Make sure we detect we are a cgi - a bit redundancy here,
but the default case is that we have to check only the first one. */
if (getenv("SERVER_SOFTWARE")
|| getenv("SERVER_NAME")
|| getenv("GATEWAY_INTERFACE")
|| getenv("REQUEST_METHOD")) {
cgi = 1;
if (argc > 1)
request_info.php_argv0 = strdup(argv[1]);
else request_info.php_argv0 = NULL;
#if FORCE_CGI_REDIRECT
if (!getenv("REDIRECT_STATUS")) {
PUTS("<b>Security Alert!</b> PHP CGI cannot be accessed directly.\n\
\n\
<P>This PHP CGI binary was compiled with force-cgi-redirect enabled. This\n\
means that a page will only be served up if the REDIRECT_STATUS CGI variable is\n\
set. This variable is set, for example, by Apache's Action directive redirect.\n\
<P>You may disable this restriction by recompiling the PHP binary with the\n\
--disable-force-cgi-redirect switch. If you do this and you have your PHP CGI\n\
binary accessible somewhere in your web tree, people will be able to circumvent\n\
.htaccess security by loading files through the PHP parser. A good way around\n\
this is to define doc_root in your php.ini file to something other than your\n\
top-level DOCUMENT_ROOT. This way you can separate the part of your web space\n\n\
which uses PHP from the normal part using .htaccess security. If you do not have\n\
any .htaccess restrictions anywhere on your site you can leave doc_root undefined.\n\
\n");
/* remove that detailed explanation some time */
return FAILURE;
}
#endif /* FORCE_CGI_REDIRECT */
}
if (php_module_startup(&sapi_module)==FAILURE) {
return FAILURE;
}
#ifdef ZTS
compiler_globals = ts_resource(compiler_globals_id);
executor_globals = ts_resource(executor_globals_id);
core_globals = ts_resource(core_globals_id);
sapi_globals = ts_resource(sapi_globals_id);
if (setjmp(EG(bailout))!=0) {
return -1;
}
#endif
SG(request_info).path_translated = NULL;
init_request_info(SLS_C);
SG(server_context) = (void *) 1; /* avoid server_context==NULL checks */
CG(extended_info) = 0;
if (!cgi) { /* never execute the arguments if you are a CGI */
request_info.php_argv0 = NULL;
while ((c = getopt(argc, argv, "c:qvisnaeh?vf:")) != -1) {
switch (c) {
case 'f':
if (!cgi_started){
if (php_request_startup(CLS_C ELS_CC PLS_CC SLS_CC)==FAILURE) {
php_module_shutdown();
return FAILURE;
}
}
if (no_headers) {
SG(headers_sent) = 1;
}
cgi_started=1;
SG(request_info).path_translated = estrdup(optarg);
/* break missing intentionally */
case 'q':
no_headers = 1;
break;
case 'v':
if (!cgi_started) {
if (php_request_startup(CLS_C ELS_CC PLS_CC SLS_CC)==FAILURE) {
php_module_shutdown();
return FAILURE;
}
}
if (no_headers) {
SG(headers_sent) = 1;
}
php3_printf("%s\n", PHP_VERSION);
exit(1);
break;
case 'i':
if (!cgi_started) {
if (php_request_startup(CLS_C ELS_CC PLS_CC SLS_CC)==FAILURE) {
php_module_shutdown();
return FAILURE;
}
}
if (no_headers) {
SG(headers_sent) = 1;
}
cgi_started=1;
php3_TreatHeaders();
php_print_info(0xFFFFFFFF);
exit(1);
break;
case 's':
behavior=PHP_MODE_HIGHLIGHT;
break;
case 'n':
behavior=PHP_MODE_INDENT;
break;
case 'c':
php3_ini_path = strdup(optarg); /* intentional leak */
break;
case 'a':
#if SUPPORT_INTERACTIVE
printf("Interactive mode enabled\n\n");
interactive=1;
#else
printf("Interactive mode not supported!\n\n");
#endif
break;
case 'e':
CG(extended_info) = 1;
break;
case 'h':
case '?':
zend_output_startup();
SG(headers_sent) = 1;
php_cgi_usage(argv[0]);
exit(1);
break;
default:
break;
}
}
} /* not cgi */
#if SUPPORT_INTERACTIVE
EG(interactive) = interactive;
#endif
if (!cgi_started) {
if (php_request_startup(CLS_C ELS_CC PLS_CC SLS_CC)==FAILURE) {
php_module_shutdown();
return FAILURE;
}
}
if (no_headers) {
SG(headers_sent) = 1;
}
file_handle.filename = "-";
file_handle.type = ZEND_HANDLE_FP;
file_handle.handle.fp = stdin;
php3_TreatHeaders();
if (!cgi) {
if (!SG(request_info).query_string) {
for (i = optind, len = 0; i < argc; i++)
len += strlen(argv[i]) + 1;
s = malloc(len + 1); /* leak - but only for command line version, so ok */
*s = '\0'; /* we are pretending it came from the environment */
for (i = optind, len = 0; i < argc; i++) {
strcat(s, argv[i]);
if (i < (argc - 1))
strcat(s, "+");
}
SG(request_info).query_string = s;
}
if (!SG(request_info).path_translated && argc > optind)
SG(request_info).path_translated = argv[optind];
}
/* If for some reason the CGI interface is not setting the
PATH_TRANSLATED correctly, SG(request_info).path_translated is NULL.
We still call php3_fopen_for_parser, because if you set doc_root
or user_dir configuration directives, PATH_INFO is used to construct
the filename as a side effect of php3_fopen_for_parser.
*/
if (cgi || SG(request_info).path_translated) {
file_handle.handle.fp = php3_fopen_for_parser();
file_handle.filename = SG(request_info).path_translated;
}
if (cgi && !file_handle.handle.fp) {
PUTS("No input file specified.\n");
#if 0 /* this is here for debuging under windows */
if (argc) {
i = 0;
php3_printf("\nargc %d\n",argc);
while (i <= argc) {
php3_printf("%s\n",argv[i]);
i++;
}
}
#endif
php_request_shutdown((void *) 0);
php_module_shutdown();
return FAILURE;
} else if (file_handle.handle.fp && file_handle.handle.fp!=stdin) {
/* #!php support */
c = fgetc(file_handle.handle.fp);
if (c == '#') {
while (c != 10 && c != 13) {
c = fgetc(file_handle.handle.fp); /* skip to end of line */
}
CG(zend_lineno)++;
} else {
rewind(file_handle.handle.fp);
}
}
switch (behavior) {
case PHP_MODE_STANDARD:
php_execute_script(&file_handle CLS_CC ELS_CC PLS_CC);
break;
case PHP_MODE_HIGHLIGHT: {
zend_syntax_highlighter_ini syntax_highlighter_ini;
if (open_file_for_scanning(&file_handle CLS_CC)==SUCCESS) {
php_get_highlight_struct(&syntax_highlighter_ini);
zend_highlight(&syntax_highlighter_ini);
fclose(file_handle.handle.fp);
}
return 0;
}
break;
case PHP_MODE_INDENT:
open_file_for_scanning(&file_handle CLS_CC);
zend_indent();
fclose(file_handle.handle.fp);
return 0;
break;
}
php3_header(); /* Make sure headers have been sent */
php_request_shutdown((void *) 0);
php_module_shutdown();
#ifdef ZTS
tsrm_shutdown();
#endif
return SUCCESS;
}
#endif
-489
View File
@@ -1,489 +0,0 @@
/* 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
-1965
View File
File diff suppressed because it is too large. Load diff
+985
View File
@@ -0,0 +1,985 @@
dnl $Id$ -*- sh -*-
dnl Process this file with autoconf to produce a configure script.
divert(0)
AC_INIT(main.c)
recurse=yes
for arg in $@; do
case $arg in
## This is to prevent "./config.status --recheck" from
## running configure in libzend again.
--no-recursion) recurse=no;;
--enable-thread-safety) threadsafe=yes;;
*) ;;
esac
done
if test "$recurse" = "yes"; then
cwd=`pwd`
(set -x; test -d libzend || mkdir libzend ; cd libzend; $cwd/$srcdir/libzend/configure --cache-file=$cwd/config.cache $@)
if test "$threadsafe" = "yes"; then
(set -x; test -d TSRM || mkdir TSRM; cd TSRM; $cwd/$srcdir/TSRM/configure --cache-file=$cwd/config.cache $@)
fi
fi
dnl ## Diversion 1 is the initial checking of OS features, programs,
dnl ## libraries and so on.
dnl ## In diversion 2 we check for compile-time options to the PHP
dnl ## core and how to deal with different system dependencies. This
dnl ## includes what regex library is used and whether debugging or short
dnl ## tags are enabled, and the default behaviour of php3.ini options.
dnl ## This is also where an SAPI interface is selected (choosing between
dnl ## Apache module, CGI etc.)
dnl ## In diversion 3 we check which extensions should be compiled.
dnl ## All of these are normally in the extension directories.
dnl ## Diversion 4 is the last one. Here we generate files and clean up.
divert(1)
dnl ## This is where the version number is changed from now on!
AM_INIT_AUTOMAKE(php, 4.0B1)
PHP_VERSION=$VERSION
echo "#define PHP_VERSION \"$PHP_VERSION\"" > php_version.h.new
cmp php_version.h.new php_version.h >/dev/null 2>&1
if test $? -ne 0 ; then
rm -f php_version.h && mv php_version.h.new php_version.h && \
echo 'Updated php_version.h'
else
rm -f php_version.h.new
fi
AC_SUBST(PHP_VERSION)
AM_CONFIG_HEADER(php_config.h)
AM_MAINTAINER_MODE
dnl We want this one before the checks, so the checks can modify CFLAGS.
test -z "$CFLAGS" && auto_cflags=1
dnl Checks for programs.
AC_PROG_YACC
if test "$YACC" != "bison -y"; then
AC_MSG_WARN(You will need bison if you want to regenerate the PHP parsers.)
else
AC_MSG_CHECKING(bison version)
set `$YACC --version| sed -e 's/^GNU Bison version //' -e 's/\./ /'`
if test "$1" = "1" -a "$2" -lt "25"; then
AC_MSG_WARN(You will need bison 1.25 if you want to regenerate the PHP parsers (found $1.$2).)
fi
AC_MSG_RESULT($1.$2 (ok))
fi
dnl ## there has to be a better way...
dnl## OLDLIBS=$LIBS; LIBS=""
AC_PROG_CC
dnl## LIBS=$OLDLIBS
AC_PROG_RANLIB
AC_PROG_CC_C_O
AC_PROG_LN_S
AC_PATH_PROG(PERL_PATH, perl)
dnl Make flex scanners use const if they can, even if __STDC__ is not
dnl true, for compilers like Sun's that only set __STDC__ true in
dnl "limit-to-ANSI-standard" mode, not in "ANSI-compatible" mode
AC_C_CONST
if test "$ac_cv_c_const" = "yes" ; then
LEX_CFLAGS="-DYY_USE_CONST"
fi
AC_SUBST(LEX_CFLAGS)
dnl Hack to work around a Mac OS X cpp problem
dnl Known versions needing this workaround are 5.3 and 5.4
if test "$ac_cv_prog_gcc" = "yes" -a "`uname -s`" = "Rhapsody"; then
CPPFLAGS="$CPPFLAGS -traditional-cpp"
fi
if test "`uname -sv`" = "AIX 4" -a "$GCC" != "yes"; then
APXS_EXP="-bE:mod_php4.exp"
fi
AC_SUBST(APXS_EXP)
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"
raw_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,"
raw_runpath_switch="-rpath "
apxs_runpath_switch="-Wl,'-rpath "
else
dnl something innocuous
ld_runpath_switch="-L"
raw_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
AC_CHECK_CC_OPTION(rdynamic)
fi
if test $php_cc_rdynamic = "yes"; then
LDFLAGS="${LDFLAGS} -rdynamic"
RDYNAMIC_LFLAGS="-rdynamic"
else
RDYNAMIC_LFLAGS=""
fi
AC_SUBST(RDYNAMIC_LFLAGS)
dnl AC_PROG_INSTALL
AC_PATH_PROG(PROG_SENDMAIL, sendmail, /usr/lib/sendmail, $PATH /usr/bin /usr/sbin /usr/etc /etc /usr/ucblib)
if test -n "$PROG_SENDMAIL"; then
AC_DEFINE(HAVE_SENDMAIL)
fi
dnl
dnl Check for /usr/pkg/{lib,include} which is where NetBSD puts binary
dnl and source packages. This should be harmless on other OSs.
dnl
if test -d /usr/pkg/include -a -d /usr/pkg/lib ; then
CFLAGS="$CFLAGS -I/usr/pkg/include"
LDFLAGS="$LDFLAGS -L/usr/pkg/lib"
fi
INCLUDES="-I\$(top_builddir)/libzend -I\$(top_builddir)/TSRM"
AC_SUBST(INCLUDES)
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) ], []) ])
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)
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)
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 arpa/inet.h locale.h)
dnl Checks for typedefs, structures, and compiler characteristics.
AC_STRUCT_TM
AC_STRUCT_TIMEZONE
AC_CACHE_CHECK([for tm_gmtoff in struct tm], ac_cv_struct_tm_gmtoff,
[AC_TRY_COMPILE([#include <sys/types.h>
#include <$ac_cv_struct_tm>], [struct tm tm; tm.tm_gmtoff;],
ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no)])
if test "$ac_cv_struct_tm_gmtoff" = yes; then
AC_DEFINE(HAVE_TM_GMTOFF)
fi
AC_CACHE_CHECK(for struct flock,php_struct_flock,
AC_TRY_COMPILE([
#include <unistd.h>
#include <fcntl.h>
],
[struct flock x;],
[
php_struct_flock=yes
],[
php_struct_flock=no
])
)
if test "$php_struct_flock" = "yes" ; then
AC_DEFINE(HAVE_STRUCT_FLOCK, 1)
else
AC_DEFINE(HAVE_STRUCT_FLOCK, 0)
fi
AC_CHECK_SIZEOF(long, 8)
AC_CHECK_SIZEOF(int, 4)
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 shutdown inet_aton)
AC_FUNC_UTIME_NULL
AC_FUNC_ALLOCA
dnl## OLDLIBS=$LIBS; LIBS=""
AC_BROKEN_SPRINTF
dnl## LIBS=$OLDLIBS
AC_REPLACE_FUNCS(getopt)
dnl AIX keeps in_addr_t in /usr/include/netinet/in.h
dnl AC_MSG_CHECKING(for in_addr_t)
AC_CACHE_VAL(ac_cv_type_$1,
[AC_EGREP_CPP(dnl
changequote(<<,>>)dnl
<<in_addr_t[^a-zA-Z_0-9]>>dnl
changequote([,]), [#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif], ac_cv_type_in_addr_t=yes, ac_cv_type_in_addr_t=no)])dnl
dnl AC_MSG_RESULT($ac_cv_type_in_addr_t)
if test $ac_cv_type_in_addr_t = no; then
AC_DEFINE(in_addr_t, u_int)
fi
divert(2)
abs_srcdir=`(cd $srcdir; pwd)`
abs_builddir=`pwd`
AC_SUBST(abs_srcdir)
AC_SUBST(abs_builddir)
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
AC_EXPAND_PATH($withval, APXS)
APXS_LDFLAGS="@SYBASE_LFLAGS@ @SYBASE_LIBS@ @SYBASE_CT_LFLAGS@ @SYBASE_CT_LIBS@"
APACHE_INCLUDE="-I`$APXS -q INCLUDEDIR`"
BINNAME=libphp4.so
INSTALL_IT="\$(APXS) -i -a -n php4 $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=
INCLUDES="$INCLUDES $APACHE_INCLUDE"
AC_DEFINE(APACHE)
AC_SUBST(APXS)
AC_SUBST(APXS_LDFLAGS)
AC_SUBST(BINNAME)
AC_SUBST(INSTALL_IT)
AC_SUBST(PHP_LIBS)
AC_SUBST(APACHE_INCLUDE)
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_php4.* libphp4.module"
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
rpath_raw=yes
if test -f $withval/src/include/httpd.h; then
AC_EXPAND_PATH($withval, withval)
APACHE_INCLUDE="-I$withval/src/include -I$withval/src/os/unix"
APACHE_TARGET=$withval/src/modules/php4
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=libmodphp4-so.a
INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET; cp apMakefile.tmpl $APACHE_TARGET/Makefile.tmpl; cp apMakefile.libdir $APACHE_TARGET/Makefile.libdir"
AC_DEFINE(APACHE)
AC_MSG_RESULT(yes - Shared Apache 1.3.x)
STRONGHOLD=
if test -f $withval/src/include/ap_config.h; then
AC_DEFINE(HAVE_AP_CONFIG_H)
fi
if test -f $withval/src/include/ap_compat.h; then
AC_DEFINE(HAVE_AP_COMPAT_H)
if test ! -f $withval/src/include/ap_config_auto.h; then
AC_MSG_ERROR(Please run Apache's configure or src/Configure program once and try again)
fi
else
if test -f $withval/src/include/compat.h; then
AC_DEFINE(HAVE_OLD_COMPAT_H)
fi
fi
else
AC_MSG_RESULT(no)
AC_MSG_ERROR(Invalid Apache directory - unable to find httpd.h under $withval/src/include)
fi
fi
INCLUDES="$INCLUDES $APACHE_INCLUDE"
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" != "libmodphp4-so.a"; then
if test "$BINNAME" != "libphp4.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
rpath_raw=yes
# For Apache 1.2.x
AC_EXPAND_PATH($withval, withval)
if test -f $withval/src/httpd.h; then
APACHE_INCLUDE=-I$withval/src
APACHE_TARGET=$withval/src
BINNAME=libphp4.a
INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET"
PHP_LIBS="-L. -lphp3"
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/php4
if test ! -d $APACHE_TARGET; then
mkdir $APACHE_TARGET
fi
BINNAME=libmodphp4.a
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/php4 -L../modules/php4 -L../../modules/php4 -lmodphp4"
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/php4
if test ! -d $APACHE_TARGET; then
mkdir $APACHE_TARGET
fi
BINNAME=libmodphp4.a
PHP_LIBS="-Lmodules/php4 -L../modules/php4 -L../../modules/php4 -lmodphp4"
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"
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=libmodphp4.a
PHP_LIBS="-Lmodules/php4 -L../modules/php4 -L../../modules/php4 -lmodphp4"
INSTALL_IT="mkdir -p $APACHE_TARGET; cp $BINNAME $APACHE_INSTALL_FILES $APACHE_TARGET"
STRONGHOLD=-DSTRONGHOLD=1
AC_DEFINE(APACHE)
AC_MSG_RESULT(yes - StrongHold)
if test -f $withval/apache/ap_config.h; then
AC_DEFINE(HAVE_AP_CONFIG_H)
fi
if test -f $withval/src/ap_compat.h; then
AC_DEFINE(HAVE_AP_COMPAT_H)
if test ! -f $withval/src/include/ap_config_auto.h; then
AC_MSG_ERROR(Please run Apache's configure or src/Configure program once and try again)
fi
else
if test -f $withval/src/compat.h; then
AC_DEFINE(HAVE_OLD_COMPAT_H)
fi
fi
else
AC_MSG_RESULT(no)
AC_MSG_ERROR(Invalid Apache directory - unable to find httpd.h under $withval)
fi
else
AC_MSG_RESULT(no)
BINNAME=php
INSTALL_IT="cp $BINNAME \$(bindir)"
fi
],[
AC_MSG_RESULT(no)
BINNAME=php
INSTALL_IT="cp $BINNAME \$(bindir)"
])
INCLUDES="$INCLUDES $APACHE_INCLUDE"
dnl## AC_SUBST(APACHE_INCLUDE)
AC_SUBST(APACHE_TARGET)
AC_SUBST(INSTALL_IT)
AC_SUBST(BINNAME)
AC_SUBST(STRONGHOLD)
AC_SUBST(PHP_LIBS)
fi
fi
AC_MSG_CHECKING(whether to use bundled regex library)
AC_ARG_WITH(system-regex,
[ --with-system-regex Do not use the bundled regex library],
[
if test -n "$APXS"; then
if test -n "`$APXS -q CFLAGS | grep USE_HSREGEX`"; then
HSREGEX=yes
else
HSREGEX=no
fi
else
if test "$withval" = "no"; then
HSREGEX=yes
else
HSREGEX=no
fi
fi
],[
if test -n "$APXS"; then
if test -n "`$APXS -q CFLAGS | grep USE_HSREGEX`"; then
HSREGEX=yes
else
HSREGEX=no
fi
else
HSREGEX=yes
fi
])
AC_MSG_RESULT($HSREGEX)
if test "$HSREGEX" = "yes"; then
REGEX_LIB=regex/libregex.a
EXTRA_LIBS="-L$abs_builddir/regex -lregex $EXTRA_LIBS"
AC_DEFINE(HSREGEX)
AC_DEFINE(REGEX,1)
else
REGEX_LIB=
AC_DEFINE(REGEX,0)
fi
AC_SUBST(REGEX_LIB)
AC_SUBST(HSREGEX)
AC_MSG_CHECKING(for mod_charset compatibility option)
AC_ARG_WITH(mod_charset,
[ --with-mod_charset Enable transfer tables for mod_charset (Rus Apache).],
[
AC_MSG_RESULT(yes)
AC_DEFINE(USE_TRANSFER_TABLES)
],[
AC_MSG_RESULT(no)
])
AC_MSG_CHECKING(for fhttpd module support)
AC_ARG_WITH(fhttpd,
[ --with-fhttpd[=DIR] Build fhttpd module. DIR is the fhttpd sources
directory, defaults to /usr/local/src/fhttpd.],
[
if test "$withval" = "yes"; then
# fhttpd source directory
withval=/usr/local/src/fhttpd
fi
if test "$withval" != "no"; then
# For fhttpd 0.3.x
if test -f $withval/servproc.h; then
FHTTPD_INCLUDE=-I$withval/
FHTTPD_LIB=$withval/servproc.o
FHTTPD_TARGET=$withval/
BINNAME=php
AC_DEFINE(FHTTPD)
AC_MSG_RESULT(yes - fhttpd 0.3.x)
else
AC_MSG_RESULT(no)
AC_MSG_ERROR(Invalid fhttpd directory - unable to find servproc.h under $withval)
fi
else
AC_MSG_RESULT(no)
fi
],[
AC_MSG_RESULT(no)
])
INCLUDES="$INCLUDES $FHTTPD_INCLUDE"
dnl## AC_SUBST(FHTTPD_INCLUDE)
AC_SUBST(FHTTPD_LIB)
AC_SUBST(FHTTPD_TARGET)
AC_MSG_CHECKING(whether to use a configuration file)
AC_ARG_WITH(config-file-path,
[ --with-config-file-path=PATH Sets the path in which to look for php3.ini
defaults to /usr/local/lib],
[
if test "$withval" = "yes"; then
AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "/usr/local/lib")
AC_DEFINE(USE_CONFIG_FILE, 1)
AC_MSG_RESULT(yes)
else
if test "$withval" != "no"; then
AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "$withval")
AC_DEFINE(USE_CONFIG_FILE, 1)
AC_MSG_RESULT(yes)
else
AC_DEFINE(CONFIGURATION_FILE_PATH, 0)
AC_DEFINE(USE_CONFIG_FILE, 0)
AC_MSG_RESULT(no)
fi
fi
],[
AC_DEFINE_UNQUOTED(CONFIGURATION_FILE_PATH, "/usr/local/lib")
AC_DEFINE(USE_CONFIG_FILE, 1)
AC_MSG_RESULT(yes)
])
AC_MSG_CHECKING(whether to include debugging symbols)
AC_ARG_ENABLE(debug,
[ --disable-debug Compile without 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(yes)
AC_DEFINE(DEBUG,1)
PHP_DEBUG=1
DEBUG_CFLAGS="-g"
])
AC_SUBST(DEBUG_CFLAGS)
AC_SUBST(PHP_DEBUG)
CFLAGS="$CFLAGS $DEBUG_CFLAGS"
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)
])
AC_MSG_CHECKING(whether to build PHP thread-safe)
AC_ARG_ENABLE(thread-safety,
[ --enable-thread-safety Whether to build PHP thread-safe.],[
TSRM_LIB='TSRM/libtsrm.a'
TSRM_DIR=TSRM
AC_DEFINE(ZTS)
],[
TSRM_DIR=""
])
AC_SUBST(TSRM_DIR)
AC_SUBST(TSRM_LIB)
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 ])
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 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)
])
DMALLOC_RESULT=no
AC_MSG_CHECKING(whether to enable dmalloc)
AC_ARG_ENABLE(dmalloc,
[ --enable-dmalloc Enable dmalloc],
[
if test "$enableval" = "yes" ; then
AC_DEFINE(HAVE_DMALLOC, 1)
AC_ADD_LIBRARY(dmalloc)
CFLAGS="$CFLAGS -DDMALLOC_FUNC_CHECK"
DMALLOC_RESULT=yes
fi
])
AC_MSG_RESULT($DMALLOC_RESULT)
divert(3)
AC_SUBST(EXTRA_LIBS)
# reading config stubs
esyscmd(./scripts/config-stubs)
divert(4)
dnl If we're using gcc and the user hasn't specified CFLAGS, add -O2.
test -n "$auto_cflags" && test -n "$GCC" && CFLAGS="$CFLAGS -O2"
dnl If we're using cc on HP-UX, add the -Ae to CFLAGS
if test -n "$auto_cflags" && test "`uname -s 2>/dev/null`" = "HP-UX"; then
test -n "$GCC" || CFLAGS="-Ae $CFLAGS"
fi
dnl *** Commented out - generates slow code and consumes a lot of
dnl *** resources during compilation - we need to figure out how
dnl *** to supply it only when absolutely necessary
dnl If we are using gcc add -fpic to make dl() work on some platforms
dnl test -n "$GCC" && CFLAGS="$CFLAGS -fpic"
AC_SUBST(CFLAGS)
AC_SUBST(PROG_SENDMAIL)
AC_SUBST(CFLAGS_SHLIB)
AC_SUBST(LDFLAGS_SHLIB)
AC_SUBST(LDFLAGS_SHLIB_EXPORT)
AC_SUBST(RPATHS)
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 libphp4.module
scripts/mkextlib regex/Makefile
@@EXT_MAKEFILES@@ build-defs.h, [
], [
if test ! -f $srcdir/ext/bcmath/number.c; then
echo "creating number.c"
echo "/* Dummy File */" > $srcdir/ext/bcmath/number.c
echo "creating number.h"
echo "/* Dummy File */" > $srcdir/ext/bcmath/number.h
fi
chmod +x scripts/mkextlib
# Hacking while airborne considered harmful.
#
echo "creating internal_functions.c"
extensions=\`grep '^s.@EXT_SUBDIRS@' \$0|sed -e 's/^.*@% *//' -e 's/%.*$//'\`
mv -f internal_functions.c internal_functions.c.old 2>/dev/null
sh $srcdir/genif.sh $srcdir/internal_functions.c.in $srcdir \$extensions > internal_functions.c
if cmp internal_functions.c.old internal_functions.c > /dev/null 2>&1; then
echo "internal_functions.c is unchanged"
mv internal_functions.c.old internal_functions.c
else
rm -f internal_functions.c.old
fi
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 "+--------------------------------------------------------------------+"
echo "| Warning: |"
echo "| You will be compiling the CGI version of PHP without any |"
echo "| redirection checking. By putting this cgi binary somewhere in |"
echo "| 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
echo "+--------------------------------------------------------------------+"
echo "| License: |"
echo "| This software is subject to the PHP License, available in this |"
echo "| distribution in the file LICENSE. By continuing this installation |"
echo "| process, you are bound by the terms of this license agreement. |"
echo "| If you do not agree with the terms of this license, you must abort |"
echo "| the installation process at this point. |"
echo "+--------------------------------------------------------------------+"
])
divert
# Local Variables:
# tab-width: 4
# End:
+418
View File
@@ -0,0 +1,418 @@
/****************************************************************************
*
* Copyright (C) 1991 Kendall Bennett.
* All rights reserved.
*
* Filename: $RCSfile$
* Version: $Revision$
*
* Language: ANSI C
* Environment: any
*
* Description: Module to implement doubly linked lists. Includes a routine
* to peform a mergesort on the doubly linked list.
*
* $Id$
*
* Revision History:
* -----------------
*
* $Log$
* Revision 1.2 1999/05/11 00:01:42 zeev
* * Get Apache to work. POST doesn't work yet.
* * There are now -I directives for the absolute path of php4, php4/libzend and the builddir for
* the Apache module, so we can #include any php/Zend header.
* * Rename config.h to php_config.h
*
* Revision 1.1 1999/04/21 23:11:20 ssb
* moved apache, com and hyperwave into ext/
*
* Revision 1.1.1.1 1999/04/07 21:03:31 zeev
* PHP 4.0
*
* Revision 1.1.1.1 1999/03/17 04:29:11 andi
* PHP4
*
* Revision 1.1.1.1 1998/12/21 07:56:22 andi
* Trying to start the zend CVS tree
*
* Revision 1.1 1998/08/12 09:29:16 steinm
* First version of Hyperwave module.
*
* Revision 1.5 91/12/31 19:39:49 kjb
* Modified include file directories.
*
* Revision 1.4 91/10/28 03:16:39 kjb
* Ported to the Iris.
*
* Revision 1.3 91/09/27 03:09:18 kjb
* Cosmetic change.
*
* Revision 1.2 91/09/03 18:27:42 ROOT_DOS
* Ported to UNIX.
*
* Revision 1.1 91/09/01 18:35:23 ROOT_DOS
* Initial revision
*
****************************************************************************/
#ifndef MSVC5
#include "php_config.h"
#endif
#include <stdio.h>
#include <malloc.h>
#include <signal.h>
#include "dlist.h"
#define PUBLIC
#define PRIVATE static
PUBLIC void *dlst_newnode(int size)
/****************************************************************************
*
* Function: dlst_newnode
* Parameters: size - Amount of memory to allocate for node
* Returns: Pointer to the allocated node's user space.
*
* Description: Allocates the memory required for a node, adding a small
* header at the start of the node. We return a reference to
* the user space of the node, as if it had been allocated via
* malloc().
*
****************************************************************************/
{
PHP_DLST_BUCKET *node;
if ( !(node = (PHP_DLST_BUCKET*)malloc(size + sizeof(PHP_DLST_BUCKET))) ) {
fprintf(stderr,"Not enough memory to allocate list node.\n");
/* raise(SIGABRT);*/
return NULL;
}
return PHP_DLST_USERSPACE(node); /* Return pointer to user space */
}
PUBLIC void dlst_freenode(void *node)
/****************************************************************************
*
* Function: dlst_freenode
* Parameters: node - Node to free.
*
* Description: Frees a node previously allocated with lst_newnode().
*
****************************************************************************/
{
free(PHP_DLST_HEADER(node));
}
PUBLIC DLIST *dlst_init(void)
/****************************************************************************
*
* Function: dlst_init
* Returns: Pointer to a newly created list.
*
* Description: Initialises a list and returns a pointer to it.
*
****************************************************************************/
{
DLIST *l;
if ((l = (DLIST*)malloc(sizeof(DLIST))) != NULL) {
l->count = 0;
l->head = &(l->hz[0]);
l->z = &(l->hz[1]);
l->head->next = l->z->next = l->z;
l->z->prev = l->head->prev = l->head;
}
else {
fprintf(stderr,"Insufficient memory to allocate list\n");
/*raise(SIGABRT);*/
return NULL;
}
return l;
}
PUBLIC void dlst_kill(DLIST *l,void (*freeNode)(void *node))
/****************************************************************************
*
* Function: dlst_kill
* Parameters: l - List to kill
* freeNode - Pointer to user routine to free a node
*
* Description: Kills the list l, by deleting all of the elements contained
* within the list one by one and then deleting the list
* itself. Note that we call the user supplied routine
* (*freeNode)() to free each list node. This allows the user
* program to perform any extra processing needed to kill each
* node (if each node contains pointers to other items on the
* heap for example). If no extra processing is required, just
* pass the address of dlst_freenode(), ie:
*
* dlst_kill(myList,dlst_freenode);
*
****************************************************************************/
{
PHP_DLST_BUCKET *n,*p;
n = l->head->next;
while (n != l->z) { /* Free all nodes in list */
p = n;
n = n->next;
(*freeNode)(PHP_DLST_USERSPACE(p));
}
free(l); /* Free the list itself */
}
PUBLIC void dlst_insertafter(DLIST *l,void *node,void *after)
/****************************************************************************
*
* Function: lst_insertafter
* Parameters: l - List to insert node into
* node - Pointer to user space of node to insert
* after - Pointer to user space of node to insert node after
*
* Description: Inserts a new node into the list after the node 'after'. To
* insert a new node at the beginning of the list, user the
* macro PHP_DLST_HEAD in place of 'after'. ie:
*
* dlst_insertafter(mylist,node,PHP_DLST_HEAD(mylist));
*
****************************************************************************/
{
PHP_DLST_BUCKET *n = PHP_DLST_HEADER(node),*a = PHP_DLST_HEADER(after);
n->next = a->next;
a->next = n;
n->prev = a;
n->next->prev = n;
l->count++;
}
PUBLIC void *dlst_deletenext(DLIST *l,void *node)
/****************************************************************************
*
* Function: lst_deletenext
* Parameters: l - List to delete node from.
* node - Node to delete the next node from
* Returns: Pointer to the deleted node's userspace.
*
* Description: Removes the node AFTER 'node' from the list l.
*
****************************************************************************/
{
PHP_DLST_BUCKET *n = PHP_DLST_HEADER(node);
node = PHP_DLST_USERSPACE(n->next);
n->next->next->prev = n;
n->next = n->next->next;
l->count--;
return node;
}
PUBLIC void *dlst_first(DLIST *l)
/****************************************************************************
*
* Function: dlst_first
* Parameters: l - List to obtain first node from
* Returns: Pointer to first node in list, NULL if list is empty.
*
* Description: Returns a pointer to the user space of the first node in
* the list. If the list is empty, we return NULL.
*
****************************************************************************/
{
PHP_DLST_BUCKET *n;
n = l->head->next;
return (n == l->z ? NULL : PHP_DLST_USERSPACE(n));
}
PUBLIC void *dlst_last(DLIST *l)
/****************************************************************************
*
* Function: dlst_last
* Parameters: l - List to obtain last node from
* Returns: Pointer to last node in list, NULL if list is empty.
*
* Description: Returns a pointer to the user space of the last node in
* the list. If the list is empty, we return NULL.
*
****************************************************************************/
{
PHP_DLST_BUCKET *n;
n = l->z->prev;
return (n == l->head ? NULL : PHP_DLST_USERSPACE(n));
}
PUBLIC void *dlst_next(void *prev)
/****************************************************************************
*
* Function: dlst_next
* Parameters: prev - Previous node in list to obtain next node from
* Returns: Pointer to the next node in the list, NULL at end of list.
*
* Description: Returns a pointer to the user space of the next node in the
* list given a pointer to the user space of the previous node.
* If we have reached the end of the list, we return NULL. The
* end of the list is detected when the next pointer of a node
* points back to itself, as does the dummy last node's next
* pointer. This enables us to detect the end of the list
* without needed access to the list data structure itself.
*
* NOTE: We do no checking to ensure that 'prev' is NOT a
* NULL pointer.
*
****************************************************************************/
{
PHP_DLST_BUCKET *n = PHP_DLST_HEADER(prev);
n = n->next;
return (n == n->next ? NULL : PHP_DLST_USERSPACE(n));
}
PUBLIC void *dlst_prev(void *next)
/****************************************************************************
*
* Function: dlst_prev
* Parameters: next - Next node in list to obtain previous node from
* Returns: Pointer to the previous node in the list, NULL at start list.
*
* Description: Returns a pointer to the user space of the prev node in the
* list given a pointer to the user space of the next node.
* If we have reached the start of the list, we return NULL. The
* start of the list is detected when the prev pointer of a node
* points back to itself, as does the dummy head node's prev
* pointer. This enables us to detect the start of the list
* without needed access to the list data structure itself.
*
* NOTE: We do no checking to ensure that 'next' is NOT a
* NULL pointer.
*
****************************************************************************/
{
PHP_DLST_BUCKET *n = PHP_DLST_HEADER(next);
n = n->prev;
return (n == n->prev ? NULL : PHP_DLST_USERSPACE(n));
}
/* Static globals required by merge() */
static PHP_DLST_BUCKET *z;
static int (*cmp)(void*,void*);
PRIVATE PHP_DLST_BUCKET *merge(PHP_DLST_BUCKET *a,PHP_DLST_BUCKET *b,PHP_DLST_BUCKET **end)
/****************************************************************************
*
* Function: merge
* Parameters: a,b - Sublist's to merge
* Returns: Pointer to the merged sublists.
*
* Description: Merges two sorted lists of nodes together into a single
* sorted list.
*
****************************************************************************/
{
PHP_DLST_BUCKET *c;
/* Go through the lists, merging them together in sorted order */
c = z;
while (a != z && b != z) {
if ((*cmp)(PHP_DLST_USERSPACE(a),PHP_DLST_USERSPACE(b)) <= 0) {
c->next = a; c = a; a = a->next;
}
else {
c->next = b; c = b; b = b->next;
}
};
/* If one of the lists is not exhausted, then re-attach it to the end
* of the newly merged list
*/
if (a != z) c->next = a;
if (b != z) c->next = b;
/* Set *end to point to the end of the newly merged list */
while (c->next != z) c = c->next;
*end = c;
/* Determine the start of the merged lists, and reset z to point to
* itself
*/
c = z->next; z->next = z;
return c;
}
PUBLIC void dlst_mergesort(DLIST *l,int (*cmp_func)(void*,void*))
/****************************************************************************
*
* Function: dlst_mergesort
* Parameters: l - List to merge sort
* cmp_func - Function to compare two user spaces
*
* Description: Mergesort's all the nodes in the list. 'cmp' must point to
* a comparison function that can compare the user spaces of
* two different nodes. 'cmp' should work the same as
* strcmp(), in terms of the values it returns. Rather than
* waste processing time keeping the previous pointers up to
* date while performing the mergesort, we simply run through
* the list at the end of the sort to fix the previous pointers.
*
****************************************************************************/
{
int i,N;
PHP_DLST_BUCKET *a,*b; /* Pointers to sublists to merge */
PHP_DLST_BUCKET *c; /* Pointer to end of sorted sublists */
PHP_DLST_BUCKET *head; /* Pointer to dummy head node for list */
PHP_DLST_BUCKET *todo; /* Pointer to sublists yet to be sorted */
PHP_DLST_BUCKET *t; /* Temporary */
/* Set up globals required by merge() and pointer to head */
z = l->z; cmp = cmp_func; head = l->head;
for (N = 1,a = z; a != head->next; N = N + N) {
todo = head->next; c = head;
while (todo != z) {
/* Build first sublist to be merged, and splice from main list
*/
a = t = todo;
for (i = 1; i < N; i++) t = t->next;
b = t->next; t->next = z; t = b;
/* Build second sublist to be merged and splice from main list
*/
for (i = 1; i < N; i++) t = t->next;
todo = t->next; t->next = z;
/* Merge the two sublists created, and set 'c' to point to the
* end of the newly merged sublists.
*/
c->next = merge(a,b,&t); c = t;
}
}
/* Fix the previous pointers for the list */
a = b = l->head;
b = b->next;
while (1) {
b->prev = a;
if (b == z)
break;
a = a->next;
b = b->next;
}
}
+137
View File
@@ -0,0 +1,137 @@
/****************************************************************************
*
* Copyright (C) 1991 Kendall Bennett.
* All rights reserved.
*
* Filename: $RCSfile$
* Version: $Revision$
*
* Language: ANSI C
* Environment: any
*
* Description: Header file for doubly linked list routines.
*
* $Id$
*
* Revision History:
* -----------------
*
* $Log$
* Revision 1.1 1999/04/21 23:11:20 ssb
* moved apache, com and hyperwave into ext/
*
* Revision 1.1.1.1 1999/04/07 21:03:20 zeev
* PHP 4.0
*
* Revision 1.1.1.1 1999/03/17 04:29:11 andi
* PHP4
*
* Revision 1.1.1.1 1998/12/21 07:56:22 andi
* Trying to start the zend CVS tree
*
* Revision 1.2 1998/08/14 15:51:12 shane
* Some work on getting hyperwave to work on windows. hg_comm needs a lot of work.
*
* Mainly, signals, fnctl, bzero, bcopy, etc are not portable functions. Most of this
* will have to be rewriten for windows.
*
* Revision 1.1 1998/08/12 09:29:16 steinm
* First version of Hyperwave module.
*
* Revision 1.5 91/12/31 19:40:54 kjb
*
* Modified include files directories.
*
* Revision 1.4 91/09/27 03:10:41 kjb
* Added compatibility with C++.
*
* Revision 1.3 91/09/26 10:07:16 kjb
* Took out extern references
*
* Revision 1.2 91/09/01 19:37:20 ROOT_DOS
* Changed DLST_TAIL macro so that it returns a pointer to the REAL last
* node of the list, not the dummy last node (l->z).
*
* Revision 1.1 91/09/01 18:38:23 ROOT_DOS
* Initial revision
*
****************************************************************************/
#ifndef __DLIST_H
#define __DLIST_H
#ifndef __DEBUG_H
/*#include "debug.h"*/
#endif
/*---------------------- Macros and type definitions ----------------------*/
typedef struct PHP_DLST_BUCKET {
struct PHP_DLST_BUCKET *next;
struct PHP_DLST_BUCKET *prev;
} PHP_DLST_BUCKET;
/* necessary for AIX 4.2.x */
#ifdef hz
#undef hz
#endif
typedef struct {
int count; /* Number of elements currently in list */
PHP_DLST_BUCKET *head; /* Pointer to head element of list */
PHP_DLST_BUCKET *z; /* Pointer to last node of list */
PHP_DLST_BUCKET hz[2]; /* Space for head and z nodes */
} DLIST;
/* Return a pointer to the user space given the address of the header of
* a node.
*/
#define PHP_DLST_USERSPACE(h) ((void*)((PHP_DLST_BUCKET*)(h) + 1))
/* Return a pointer to the header of a node, given the address of the
* user space.
*/
#define PHP_DLST_HEADER(n) ((PHP_DLST_BUCKET*)(n) - 1)
/* Return a pointer to the user space of the list's head node. This user
* space does not actually exist, but it is useful to be able to address
* it to enable insertion at the start of the list.
*/
#define PHP_DLST_HEAD(l) PHP_DLST_USERSPACE((l)->head)
/* Return a pointer to the user space of the last node in list. */
#define PHP_DLST_TAIL(l) PHP_DLST_USERSPACE((l)->z->prev)
/* Determine if a list is empty
*/
#define PHP_DLST_EMPTY(l) ((l)->count == 0)
/*-------------------------- Function Prototypes --------------------------*/
#ifdef __cplusplus
extern "C" {
#endif
void *dlst_newnode(int size);
void dlst_freenode(void *node);
DLIST *dlst_init(void);
void dlst_kill(DLIST *l,void (*freeNode)(void *node));
void dlst_insertafter(DLIST *l,void *node,void *after);
void *dlst_deletenext(DLIST *l,void *node);
void *dlst_first(DLIST *l);
void *dlst_last(DLIST *l);
void *dlst_next(void *prev);
void *dlst_prev(void *next);
void dlst_mergesort(DLIST *l,int (*cmp_func)(void*,void*));
#ifdef __cplusplus
}
#endif
#endif
+9
View File
@@ -0,0 +1,9 @@
## Process this file with automake to produce Makefile.in
SUBDIRS = @EXT_SUBDIRS@
noinst_LIBRARIES=libphpext.a
libphpext.a: @EXT_LIBS@
top_srcdir=$(top_srcdir) $(top_builddir)/scripts/mkextlib $@ $(SUBDIRS)
-@test "`uname -s`" = "Rhapsody" && $(RANLIB) $@
+6
View File
@@ -0,0 +1,6 @@
# $Id$
INCLUDES=@INCLUDES@ -I@top_srcdir@ -I@top_srcdir@/libzend
noinst_LIBRARIES=libphpext_apache.a
libphpext_apache_a_SOURCES=apache.c
+445
View File
@@ -0,0 +1,445 @@
/*
+----------------------------------------------------------------------+
| PHP version 4.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997, 1998, 1999 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.0 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_0.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
| Stig Sæther Bakken <ssb@guardian.no> |
| David Sklar <sklar@student.net> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
#include "php.h"
#include "ext/standard/head.h"
#include "php_globals.h"
#include "php_ini.h"
#include "SAPI.h"
#include "mod_php4.h"
#include "ext/standard/info.h"
#include <stdlib.h>
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <string.h>
#include <errno.h>
#include <ctype.h>
#if APACHE
#include "http_request.h"
#include "build-defs.h"
#define SECTION(name) PUTS("<hr><h2>" name "</h2>\n")
extern module *top_module;
PHP_FUNCTION(virtual);
PHP_FUNCTION(getallheaders);
PHP_FUNCTION(apachelog);
void php3_info_apache(ZEND_MODULE_INFO_FUNC_ARGS);
PHP_FUNCTION(apache_note);
PHP_FUNCTION(apache_lookup_uri);
function_entry apache_functions[] = {
{"virtual", php3_virtual, NULL},
{"getallheaders", php3_getallheaders, NULL},
{"apache_note", php3_apache_note,NULL},
{"apache_lookup_uri", php3_apache_lookup_uri,NULL},
{NULL, NULL, NULL}
};
static PHP_INI_MH(OnChangeApacheInt)
{
long *p;
char *base = (char *) &php_apache_info;
p = (long *) (base+(size_t) mh_arg1);
if (new_value) {
*p = atoi(new_value);
return SUCCESS;
} else {
return FAILURE;
}
}
static PHP_INI_MH(OnChangeApacheString)
{
char **p;
char *base = (char *) &php_apache_info;
p = (char **) (base+(size_t) mh_arg1);
if (new_value) {
*p = new_value;
return SUCCESS;
} else {
return FAILURE;
}
}
PHP_INI_BEGIN()
PHP_INI_ENTRY1("xbithack", "0", PHP_INI_ALL, OnChangeApacheInt, (void *) XtOffsetOf(php_apache_info_struct, xbithack))
PHP_INI_ENTRY1("engine", "1", PHP_INI_ALL, OnChangeApacheInt, (void *) XtOffsetOf(php_apache_info_struct, engine))
PHP_INI_ENTRY1("last_modified", "0", PHP_INI_ALL, OnChangeApacheInt, (void *) XtOffsetOf(php_apache_info_struct, last_modified))
PHP_INI_ENTRY1("dav_script", NULL, PHP_INI_ALL, OnChangeApacheString, (void *) XtOffsetOf(php_apache_info_struct, dav_script))
PHP_INI_END()
static int php_apache_minit(INIT_FUNC_ARGS)
{
REGISTER_INI_ENTRIES();
return SUCCESS;
}
static int php_apache_mshutdown(SHUTDOWN_FUNC_ARGS)
{
UNREGISTER_INI_ENTRIES();
return SUCCESS;
}
php3_module_entry apache_module_entry = {
"Apache", apache_functions, php_apache_minit, php_apache_mshutdown, NULL, NULL, php3_info_apache, STANDARD_MODULE_PROPERTIES
};
/* {{{ proto string apache_note(string note_name [, string note_value])
Get and set Apache request notes */
PHP_FUNCTION(apache_note)
{
pval *arg_name,*arg_val;
char *note_val;
int arg_count = ARG_COUNT(ht);
SLS_FETCH();
if (arg_count<1 || arg_count>2 ||
getParameters(ht,arg_count,&arg_name,&arg_val) == FAILURE ) {
WRONG_PARAM_COUNT;
}
convert_to_string(arg_name);
note_val = (char *) table_get(((request_rec *) SG(server_context))->notes,arg_name->value.str.val);
if (arg_count == 2) {
convert_to_string(arg_val);
table_set(((request_rec *) SG(server_context))->notes,arg_name->value.str.val,arg_val->value.str.val);
}
if (note_val) {
RETURN_STRING(note_val,1);
} else {
RETURN_FALSE;
}
}
/* }}} */
void php3_info_apache(ZEND_MODULE_INFO_FUNC_ARGS)
{
module *modp = NULL;
char output_buf[128];
#if !defined(WIN32) && !defined(WINNT)
char name[64];
char *p;
#endif
server_rec *serv;
extern char server_root[MAX_STRING_LEN];
extern uid_t user_id;
extern char *user_name;
extern gid_t group_id;
extern int max_requests_per_child;
SLS_FETCH();
serv = ((request_rec *) SG(server_context))->server;
{
register int i;
array_header *arr;
table_entry *elts;
request_rec *r;
SLS_FETCH();
r = ((request_rec *) SG(server_context));
arr = table_elts(r->subprocess_env);
elts = (table_entry *)arr->elts;
SECTION("Apache Environment");
PUTS("<table border=5 width=\"600\">\n");
php_info_print_table_header(2, "Variable", "Value");
for (i=0; i < arr->nelts; i++) {
php_info_print_table_row(2, elts[i].key, elts[i].val);
}
PUTS("</table>\n");
}
{
array_header *env_arr;
table_entry *env;
int i;
request_rec *r;
SLS_FETCH();
r = ((request_rec *) SG(server_context));
SECTION("HTTP Headers Information");
PUTS("<table border=5 width=\"600\">\n");
PUTS(" <tr><th colspan=2 bgcolor=\"" PHP_HEADER_COLOR "\">HTTP Request Headers</th></tr>\n");
php_info_print_table_row(2, "HTTP Request", r->the_request);
env_arr = table_elts(r->headers_in);
env = (table_entry *)env_arr->elts;
for (i = 0; i < env_arr->nelts; ++i) {
if (env[i].key) {
php_info_print_table_row(2, env[i].key, env[i].val);
}
}
PUTS(" <tr><th colspan=2 bgcolor=\"" PHP_HEADER_COLOR "\">HTTP Response Headers</th></tr>\n");
env_arr = table_elts(r->headers_out);
env = (table_entry *)env_arr->elts;
for(i = 0; i < env_arr->nelts; ++i) {
if (env[i].key) {
php_info_print_table_row(2, env[i].key, env[i].val);
}
}
PUTS("</table>\n\n");
}
PUTS("<table border=5 width=\"600\">\n");
php_info_print_table_header(2, "Entry", "Value");
#if WIN32|WINNT
PUTS("Apache for Windows 95/NT<br>");
#else
php_info_print_table_row(2, "APACHE_INCLUDE", PHP_APACHE_INCLUDE);
php_info_print_table_row(2, "APACHE_TARGET", PHP_APACHE_TARGET);
#endif
php_info_print_table_row(2, "Apache Version", SERVER_VERSION);
#ifdef APACHE_RELEASE
sprintf(output_buf, "%d", APACHE_RELEASE);
php_info_print_table_row(2, "Apache Release", output_buf);
#endif
sprintf(output_buf, "%d", MODULE_MAGIC_NUMBER);
php_info_print_table_row(2, "Apache API Version", output_buf);
sprintf(output_buf, "%s:%u", serv->server_hostname,serv->port);
php_info_print_table_row(2, "Hostname/Port", output_buf);
#if !defined(WIN32) && !defined(WINNT)
sprintf(output_buf, "%s(%d)/%d", user_name,(int)user_id,(int)group_id);
php_info_print_table_row(2, "User/Group", output_buf);
sprintf(output_buf, "per child: %d<br>keep alive: %s<br>max per connection: %d",max_requests_per_child,serv->keep_alive ? "on":"off", serv->keep_alive_max);
php_info_print_table_row(2, "Max Requests", output_buf);
#endif
sprintf(output_buf, "connection: %d<br>keep-alive: %d",serv->timeout,serv->keep_alive_timeout);
php_info_print_table_row(2, "Timeouts", output_buf);
#if !defined(WIN32) && !defined(WINNT)
php_info_print_table_row(2, "Server Root", server_root);
PUTS("<tr><td valign=\"top\" bgcolor=\"" PHP_ENTRY_NAME_COLOR "\">Loaded modules</td><td bgcolor=\"" PHP_CONTENTS_COLOR "\">");
for(modp = top_module; modp; modp = modp->next) {
strncpy(name, modp->name, sizeof(name) - 1);
if ((p = strrchr(name, '.'))) {
*p='\0'; /* Cut off ugly .c extensions on module names */
}
PUTS(name);
if (modp->next) {
PUTS(", ");
}
}
#endif
PUTS("</td></tr>\n");
PUTS("</table>\n");
}
/* This function is equivalent to <!--#include virtual...-->
* in mod_include. It does an Apache sub-request. It is useful
* for including CGI scripts or .shtml files, or anything else
* that you'd parse through Apache (for .phtml files, you'd probably
* want to use <?Include>. This only works when PHP is compiled
* as an Apache module, since it uses the Apache API for doing
* sub requests.
*/
/* {{{ proto int virtual(string filename)
Perform an Apache sub-request */
PHP_FUNCTION(virtual)
{
pval *filename;
request_rec *rr = NULL;
SLS_FETCH();
if (ARG_COUNT(ht) != 1 || getParameters(ht,1,&filename) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string(filename);
if (!(rr = sub_req_lookup_uri (filename->value.str.val, ((request_rec *) SG(server_context))))) {
php3_error(E_WARNING, "Unable to include '%s' - URI lookup failed", filename->value.str.val);
if (rr) destroy_sub_req (rr);
RETURN_FALSE;
}
if (rr->status != 200) {
php3_error(E_WARNING, "Unable to include '%s' - error finding URI", filename->value.str.val);
if (rr) destroy_sub_req (rr);
RETURN_FALSE;
}
/* Cannot include another PHP file because of global conflicts */
if (rr->content_type &&
!strcmp(rr->content_type, PHP3_MIME_TYPE)) {
php3_error(E_WARNING, "Cannot include a PHP file "
"(use <code>&lt;?include \"%s\"&gt;</code> instead)", filename->value.str.val);
if (rr) destroy_sub_req (rr);
RETURN_FALSE;
}
if (run_sub_req(rr)) {
php3_error(E_WARNING, "Unable to include '%s' - request execution failed", filename->value.str.val);
if (rr) destroy_sub_req (rr);
RETURN_FALSE;
} else {
if (rr) destroy_sub_req (rr);
RETURN_TRUE;
}
}
/* }}} */
/* {{{ proto array getallheaders(void)
Fetch all HTTP request headers */
PHP_FUNCTION(getallheaders)
{
array_header *env_arr;
table_entry *tenv;
int i;
SLS_FETCH();
if (array_init(return_value) == FAILURE) {
RETURN_FALSE;
}
env_arr = table_elts(((request_rec *) SG(server_context))->headers_in);
tenv = (table_entry *)env_arr->elts;
for (i = 0; i < env_arr->nelts; ++i) {
if (!tenv[i].key ||
(PG(safe_mode) &&
!strncasecmp(tenv[i].key, "authorization", 13))) {
continue;
}
if (add_assoc_string(return_value, tenv[i].key,(tenv[i].val==NULL) ? "" : tenv[i].val, 1)==FAILURE) {
RETURN_FALSE;
}
}
}
/* }}} */
/* {{{ proto class apache_lookup_uri(string URI)
Perform a partial request of the given URI to obtain information about it */
PHP_FUNCTION(apache_lookup_uri)
{
pval *filename;
request_rec *rr=NULL;
SLS_FETCH();
if (ARG_COUNT(ht) != 1 || getParameters(ht,1,&filename) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string(filename);
if(!(rr = sub_req_lookup_uri(filename->value.str.val, ((request_rec *) SG(server_context))))) {
php3_error(E_WARNING, "URI lookup failed", filename->value.str.val);
RETURN_FALSE;
}
object_init(return_value);
add_property_long(return_value,"status",rr->status);
if (rr->the_request) {
add_property_string(return_value,"the_request",rr->the_request,1);
}
if (rr->status_line) {
add_property_string(return_value,"status_line",(char *)rr->status_line,1);
}
if (rr->method) {
add_property_string(return_value,"method",(char *)rr->method,1);
}
if (rr->content_type) {
add_property_string(return_value,"content_type",(char *)rr->content_type,1);
}
if (rr->handler) {
add_property_string(return_value,"handler",(char *)rr->handler,1);
}
if (rr->uri) {
add_property_string(return_value,"uri",rr->uri,1);
}
if (rr->filename) {
add_property_string(return_value,"filename",rr->filename,1);
}
if (rr->path_info) {
add_property_string(return_value,"path_info",rr->path_info,1);
}
if (rr->args) {
add_property_string(return_value,"args",rr->args,1);
}
if (rr->boundary) {
add_property_string(return_value,"boundary",rr->boundary,1);
}
add_property_long(return_value,"no_cache",rr->no_cache);
add_property_long(return_value,"no_local_copy",rr->no_local_copy);
add_property_long(return_value,"allowed",rr->allowed);
add_property_long(return_value,"sent_bodyct",rr->sent_bodyct);
add_property_long(return_value,"bytes_sent",rr->bytes_sent);
add_property_long(return_value,"byterange",rr->byterange);
add_property_long(return_value,"clength",rr->clength);
#if MODULE_MAGIC_NUMBER >= 19980324
if (rr->unparsed_uri) {
add_property_string(return_value,"unparsed_uri",rr->unparsed_uri,1);
}
if(rr->mtime) {
add_property_long(return_value,"mtime",rr->mtime);
}
#endif
if(rr->request_time) {
add_property_long(return_value,"request_time",rr->request_time);
}
destroy_sub_req(rr);
}
/* }}} */
#if 0
This function is most likely a bad idea. Just playing with it for now.
PHP_FUNCTION(apache_exec_uri)
{
pval *filename;
request_rec *rr=NULL;
SLS_FETCH();
if (ARG_COUNT(ht) != 1 || getParameters(ht,1,&filename) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string(filename);
if(!(rr = ap_sub_req_lookup_uri(filename->value.str.val, ((request_rec *) SG(server_context))))) {
php3_error(E_WARNING, "URI lookup failed", filename->value.str.val);
RETURN_FALSE;
}
RETVAL_LONG(ap_run_sub_req(rr));
ap_destroy_sub_req(rr);
}
#endif
#endif
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
+5
View File
@@ -0,0 +1,5 @@
dnl $Id$
if test -n "$APACHE_INCLUDE"; then
PHP_EXTENSION(apache)
fi
+6
View File
@@ -0,0 +1,6 @@
# $Id$
INCLUDES=@INCLUDES@ -I@top_srcdir@ -I@top_srcdir@/libzend
noinst_LIBRARIES=libphpext_aspell.a
libphpext_aspell_a_SOURCES=aspell.c
+203
View File
@@ -0,0 +1,203 @@
/*
+----------------------------------------------------------------------+
| PHP version 4.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997, 1998, 1999 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.0 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_0.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: |
+----------------------------------------------------------------------+
*/
/* $Id$ */
#include "php.h"
#if defined(COMPILE_DL)
#include "phpdl.h"
#endif
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>
#if HAVE_ASPELL
#include "php3_aspell.h"
#if APACHE
# ifndef DEBUG
# undef palloc
# endif
#endif
#include <aspell-c.h>
function_entry aspell_functions[] = {
{"aspell_new", php3_aspell_new, NULL},
{"aspell_check", php3_aspell_check, NULL},
{"aspell_check_raw", php3_aspell_check_raw, NULL},
{"aspell_suggest", php3_aspell_suggest, NULL},
{NULL, NULL, NULL}
};
static int le_aspell;
php3_module_entry aspell_module_entry = {
"Aspell", aspell_functions, php3_minit_aspell, NULL, NULL, NULL, php3_info_aspell, STANDARD_MODULE_PROPERTIES
};
#if COMPILE_DL
DLEXPORT php3_module_entry *get_module(void) { return &aspell_module_entry; }
#endif
int php3_minit_aspell(INIT_FUNC_ARGS)
{
le_aspell = register_list_destructors(php3_aspell_close,NULL);
return SUCCESS;
}
void php3_aspell_close(aspell *sc)
{
aspell_free(sc);
}
/* {{{ proto int aspell_new(string master[, string personal])
Load a dictionary */
void php3_aspell_new(INTERNAL_FUNCTION_PARAMETERS)
{
pval *master, *personal;
int argc;
aspell *sc;
int ind;
argc = ARG_COUNT(ht);
if (argc < 1 || argc > 2 || getParameters(ht, argc, &master,&personal) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string(master);
if(argc==2)
{
convert_to_string(personal) ;
sc=aspell_new(master->value.str.val,personal->value.str.val);
}
else
sc=aspell_new(master->value.str.val,"");
ind = php3_list_insert(sc, le_aspell);
RETURN_LONG(ind);
}
/* }}} */
/* {{{ proto array aspell_suggest(aspell int,string word)
Return array of Suggestions */
void php3_aspell_suggest(INTERNAL_FUNCTION_PARAMETERS)
{
pval *scin, *word;
int argc;
aspell *sc;
int ind,type;
aspellSuggestions *sug;
size_t i;
argc = ARG_COUNT(ht);
if (argc != 2 || getParameters(ht, argc, &scin,&word) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(scin);
convert_to_string(word);
sc= (aspell *) php3_list_find(scin->value.lval, &type);
if(!sc)
{
php3_error(E_WARNING, "%d is not a ASPELL result index", scin->value.lval);
RETURN_FALSE;
}
if (array_init(return_value) == FAILURE) {
RETURN_FALSE;
}
sug = aspell_suggest(sc, word->value.str.val);
for (i = 0; i != sug->size; ++i) {
add_next_index_string(return_value,(char *)sug->data[i],1);
}
aspell_free_suggestions(sug);
}
/* }}} */
/* {{{ proto int aspell_check(aspell int,string word)
Return if word is valid */
void php3_aspell_check(INTERNAL_FUNCTION_PARAMETERS)
{
int type;
pval *scin,*word;
aspell *sc;
int argc;
argc = ARG_COUNT(ht);
if (argc != 2 || getParameters(ht, argc, &scin,&word) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(scin);
convert_to_string(word);
sc= (aspell *) php3_list_find(scin->value.lval, &type);
if(!sc)
{
php3_error(E_WARNING, "%d is not a ASPELL result index", scin->value.lval);
RETURN_FALSE;
}
if (aspell_check(sc, word->value.str.val))
{
RETURN_TRUE;
}
else
{
RETURN_FALSE;
}
}
/* }}} */
/* {{{ proto int aspell_check_raw(aspell int,string word)
Return if word is valid, ignoring case or trying to trim it in any way*/
void php3_aspell_check_raw(INTERNAL_FUNCTION_PARAMETERS)
{
pval *scin,*word;
int type;
int argc;
aspell *sc;
argc = ARG_COUNT(ht);
if (argc != 2 || getParameters(ht, argc, &scin,&word) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(scin);
convert_to_string(word);
sc= (aspell *) php3_list_find(scin->value.lval, &type);
if(!sc)
{
php3_error(E_WARNING, "%d is not a ASPELL result index", scin->value.lval);
RETURN_FALSE;
}
if (aspell_check_raw(sc, word->value.str.val))
{
RETURN_TRUE;
}
else
{
RETURN_FALSE;
}
}
/* }}} */
void php3_info_aspell(ZEND_MODULE_INFO_FUNC_ARGS)
{
php3_printf("ASpell support enabled");
}
#endif
+4
View File
@@ -0,0 +1,4 @@
/* Define if you want the ASPELL interface */
#ifndef HAVE_ASPELL
#define HAVE_ASPELL 0
#endif
+28
View File
@@ -0,0 +1,28 @@
dnl $Id$
AC_MSG_CHECKING(for ASPELL support)
AC_ARG_WITH(aspell,
[ --with-aspell[=DIR] Include ASPELL support.],
[
if test "$withval" != "no"; then
if test "$withval" = "yes"; then
ASPELL_DIR=/usr/local
else
ASPELL_DIR=$withval
fi
AC_ADD_INCLUDE($ASPELL_DIR/include)
AC_ADD_LIBRARY_WITH_PATH(aspell, $ASPELL_DIR/lib)
if test ! -f "$ASPELL_DIR/include/aspell-c.h"; then
AC_MSG_ERROR(Could not find aspell-c.h in $ASPELL_DIR/include - please copy it manually from the aspell sources to $ASPELL_DIR/include)
fi
AC_DEFINE(HAVE_ASPELL)
AC_MSG_RESULT(yes)
PHP_EXTENSION(aspell)
else
AC_MSG_ERROR(no)
fi
],[
AC_MSG_RESULT(no)
])
Loaded 100 of 541 files, more files were not shown because too many files have changed in this diff. Show more